/*****************************************************************************/
/*!	\file		IEC61850API.h
 *	\brief		IEC61850 API header file
 *	\par		Dalian Yunxing Tech Co., Ltd.
 *
 *				Dalian, China
 *				Phone: +86 (411) 8825 4852
 *				Email: yx@yunxing.tech
 */
/*****************************************************************************/
#ifndef IEC61850_INCLUDED
#define IEC61850_INCLUDED 1

#include "sysctype.h"
#include "IEC61850Types.h"

/*
Library Control complier options

In a windows environment

	if PIS10_STATIC is defined then the library will be complied for static linking

	For making a DLL define PIS10_EXPORTS
	For using the DLL no NOT define PIS10_EXPORTS
*/

#if defined(WIN32) || defined(WIN64)
#ifdef PIS10_STATIC
#define PIS10_API
#else
#if defined(PIS10_EXPORTS) || defined(DLL_EXPORT)
#define PIS10_API __declspec(dllexport)
#else
#define PIS10_API __declspec(dllimport)
#endif
#endif
#else
#define PIS10_API
#endif

/*!	\brief	YX-PIS 版本号 */
#define YX_PIS_VERSION         "V2.1.8"

/*!
 *	\defgroup	DataAttributeAccess	数据属性访问
 *	\defgroup	Management			IEC61850对象管理
 *	\defgroup	Time				时间与日期
 *	\defgroup	ModelData			模型和数据
 *	\defgroup	DataSet				数据集
 *	\defgroup	ControlBlock		控制块
 *	\defgroup	BRCB				缓存报告控制块
 *	\defgroup	URCB				非缓存报告控制块
 *	\defgroup	LCB					日志控制块
 *	\defgroup	SGCB				定值组控制块
 *	\defgroup	GooseCB				GOOSE控制块
 *	\defgroup	MSVCB				多播采样值控制块
 *	\defgroup	Report				报告
 *	\defgroup	Control				控制函数
 *	\defgroup	File				文件
 *	\defgroup	RPC					远程过程调用
 *	\defgroup	Support				支持
 */


#ifdef __cplusplus
extern "C" {
#endif
/*!	\brief	创建 IEC61850 客户端 / 服务端 对象。
	\details
	该接口以 IEC61850 对象属性参数 `IEC61850_Parameters` 作为入参，<br>
	并按照属性参数的配置创建对应角色（客户端 / 服务端）的 IEC61850 对象。

	\ingroup	Management

	\param[in]		param		IEC61850 对象的属性参数
	\param[in,out]	errorCode	错误码。<br>如果 IEC61850 对象创建成功，则值为 #IEC61850_ERROR_NONE (0)；<br>
								如果 IEC61850 对象创建失败，则值为其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\return	IEC61850 对象创建成功，将返回创建的 IEC61850 对象；<br>
			IEC61850 对象创建失败，则返回 NULL。同时，errorCode 将返回具体的错误码。

	\see	IEC61850_Free()

	<b>示例</b>

	创建服务端实例：
	\code
	IEC61850_ErrorCode error = S_OK;
	IEC61850 server = NULL;
	IEC61850_Parameters param = { 0 };	// must be initialized to zero value

	param.clientServerFlag	= IEC61850_SERVER;		// This is a IEC 61850 Server
	param.Ed1_Ed2_Flag		= IEC61850_Edition2;	// Set the IEC61850 Edition
	param.options			= IEC61850_OPTION_NONE;	// No options set
	param.cmdTermTimeout	= 0;					// Command Termination timeout 0 will default to 10 seconds
	param.fnReadCallback	= ReadFunction;			// Assign Read Callback Function
	param.fnWriteCallback	= WriteFunction;		// Assign Write Callback Function
	param.fnSelectCallback	= NULL;					// Ignoring Select commands
	param.fnOperateCallback	= OperateFunction;		// Assign Operate Callback Function
	param.fnCancelCallback	= NULL;					// Ignoring Cancel commands

	server = IEC61850_Create(&param, &error);
	if (!server) {
		printf("Failed to create IEC61850 server: %s (%d)", IEC61850_ErrorString(error), error);
	}
	\endcode

	创建客户端实例：
	\code
	IEC61850_ErrorCode error = S_OK;
	IEC61850 client = NULL;
	IEC61850_Parameters param = { 0 };	// must be initialized to zero value

	param.clientServerFlag	= IEC61850_CLIENT;		// This is a IEC 61850 Client
	param.options			= IEC61850_OPTION_NONE;	// No options set
	param.fnUpdateCallback	= UpdateFunction;		// Assign Update Callback Function for Client

	client = IEC61850_Create(&param, &error);
	if (!client) {
		printf("Failed to create IEC61850 client: %s (%d)", IEC61850_ErrorString(error), error);
	}
	\endcode
*/
PIS10_API IEC61850 IEC61850_Create(IEC61850_Parameters* param, IEC61850_ErrorCode* errorCode);

/*!	\brief	删除和释放 `IEC61850_Create()` 创建的 IEC61850 对象和相关资源
	\details
	应在 `IEC61850_Stop()` 调用之后调用。

	\ingroup	Management

	\param[in]	iec61850	IEC61850 对象。<br>由 `IEC61850_Create()` 创建。

	\return	错误码。<br>
			成功则返回 #IEC61850_ERROR_NONE (0)；<br>
			失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\attention
	用于 IEC61850_SetUserData() 接口的自定义用户数据资源，不会被该接口释放，需自行管理其生命周期。

	\see	IEC61850_Create()

	<b>示例</b>
	\code
	IEC61850_ErrorCode error = S_OK;
	error = IEC61850_Free(iec61850);	// 'iec61850' is the IEC61850 instance created by IEC61850_Create()
	if (error != S_OK) {
		printf("Failed to free IEC61850 object: %s (%d)", IEC61850_ErrorString(error), error);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_Free(IEC61850 iec61850);

/*!	\brief	为指定的 IEC61850 对象加载模型文件。
	\details
	以 IEC61850_Create() 创建的 IEC61850 对象、以及模型文件作为入参，调用后，IEC61850 对象将按指定的模型文件来加载。

	\ingroup	Management

	\param[in]	iec61850	IEC61850 对象。<br>由 IEC61850_Create() 创建。
	\param[in]	sclFileName	要加载的模型文件。<br>
							模型文件只能是 cid 文件。<br>
							需要包含基于协议栈进程所在目录的相对文件路径，以及文件后缀名。<br>
							例如：\"./mms-cid/server.cid\"，\"./mms-cid/client.cid\"。

	\return	错误码<br>
			模型文件加载成功，则返回 `#IEC61850_ERROR_NONE` (0)<br>
			模型文件加载失败，则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。 

	\attention
	如果想更改 IEC61850 对象加载的模型文件，不能直接二次调用该接口。<br>
	必须先删除当前的 IEC61850 对象（通过 #IEC61850_Free() 删除），<br>
	再重新创建新的 IEC61850 对象（通过 #IEC61850_Create() 创建），<br>
	再通过该接口为新的 IEC61850 对象指定新的模型文件。

	<b>示例</b>
	\code
	IEC61850_ErrorCode error = S_OK;
	error = IEC61850_LoadSCLFile(iec61850, "./mms-cid/server.cid");	// 'iec61850' is the IEC61850 instance created by IEC61850_Create()
	if (error != S_OK) {
		printf("Failed to load SCL file: %s (%d)", IEC61850_ErrorString(error), error);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_LoadSCLFile(IEC61850 iec61850, const char* sclFileName);

/*!	\brief	为指定的 IEC61850 客户端对象加载服务端的模型文件(支持多文件）
	\details
	该接口由客户端使用，用于让客户端直接加载服务端的模型，无需制作客户端的模型。<br>
	指定的 sclList 为服务端的 cid、scd 文件列表，<br>
	客户端的接入信息，通过外部的客户端配置文件 client.ini 配置，这一步是必须要做的。

	\ingroup	Management

	\param[in]	client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	sclList		要连接的服务端的模型文件列表。<br>
							模型文件只能是 cid，scd 文件。<br>
							需要包含基于协议栈进程所在目录的相对文件路径，以及文件后缀名。<br>
							例如：\"./mms-cid/server.cid\"。
	\return	错误码<br>
			模型文件加载成功，则返回 `#IEC61850_ERROR_NONE` (0)<br>
			模型文件加载失败，则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\attention
	如果想更改 IEC61850 对象加载的模型文件，不能直接二次调用该接口。<br>
	必须先删除当前的 IEC61850 对象（通过 #IEC61850_Free() 删除），再重新创建新的 IEC61850 对象（通过 #IEC61850_Create() 创建），<br>
	再通过该接口为新的 IEC61850 对象指定新的模型文件。

	<b>示例</b>

	配置文件例：<br>
	在client.ini中配置：
	\code
	[IED]
	name=ClientIED					# 为客户端设置设备名
	AP_Count=1						# 表示客户端设置1个接入点
	[AP_0]							# 第一个接入点，AP_加序号，序号从0开始
	name=ap01						# 接入点名称
	ipAddress=192.168.8.1			# 接入点IP
	subnet=255.255.255.0			# 子网掩码
	gateway=192.168.8.2				# 网关地址
	macAddress=00-50-56-C0-00-08	# 接入点MAC地址（如果需要订阅goose或者sv）
	\endcode

	接口调用例：
	\code
	IEC61850_ErrorCode result = S_OK;

	StringList* sclList = StringListMalloc();
	StringListAdd(sclList, "./mms-cid/server1.cid");
	StringListAdd(sclList, "./mms-cid/server2.cid");

	result = IEC61850_LoadServerSCLList(iec61850, sclList);
	if (result != S_OK) {
		printf("   Loading SCL file list has failed: %s (%d)\n", filename, IEC61850_ErrorString(result), result);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_LoadServerSCLList(IEC61850 client, StringList* sclList);

/*!	\brief	该接口用于客户端通过配置文件(cid中表述子网及装置连接信息的部分)直接连接服务端。
	\details
	协议栈会根据加载的模型文件，来启动对应的服务。<br>
	该接口需要在 IEC61850_Create() 创建完 IEC61850 客户端实例之后调用。<br>
	使用的客户端配置文件，是一个基于 cid 模型文件裁剪的 xml 文件，<br>
	可从一个常规的客户端 cid 模型来提取，<br>
	去掉标准模型文件中的 IED 中的 LD、LN 的模型，以及数据类型模板(DataTypeTemplates)的部分，<br>
	保留客户端、服务端的通信(Communication)信息，以及 IED 与 Communication 的关联关系即可。

	\ingroup	Management

	\param[in]	client	IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	cfg		客户端配置文件路径

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>

	配置文件例：
	\code
	<SCL xmlns="http://www.iec.ch/61850/2003/SCL" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" release="4" revision="B" version="2007" xsi:schemaLocation="http://www.iec.ch/61850/2003/SCL SCL.xsd">
	<Header id="0" version="0"/>
	<Communication>
		<SubNetwork name="SubNetworkName">
			<ConnectedAP apName="CAP" iedName="ClientIED">
				<Address>
					<P type="OSI-AP-Title">1,1,9999,1</P>
					<P type="OSI-AE-Qualifier">12</P>
					<P type="OSI-PSEL">00000001</P>
					<P type="OSI-SSEL">0001</P>
					<P type="OSI-TSEL">0001</P>
					<P type="IP">192.168.8.1</P>
					<P type="IP-SUBNET">255.255.255.0</P>
					<P type="IP-GATEWAY">192.168.8.2</P>
					<P type="MAC-Address">00-50-56-C0-00-08</P>
				</Address>
			</ConnectedAP>
			<ConnectedAP apName="SAP" iedName="ServerIED">
				<Address>
					<P type="OSI-AP-Title">1,1,9999,1</P>
					<P type="OSI-AE-Qualifier">12</P>
					<P type="OSI-PSEL">00000001</P>
					<P type="OSI-SSEL">0001</P>
					<P type="OSI-TSEL">0001</P>
					<P type="IP">192.168.8.1</P>
					<P type="IP-SUBNET">255.255.255.0</P>
					<P type="IP-GATEWAY">192.168.8.2</P>
					<P type="MAC-Address">00-50-56-C0-00-08</P>
				</Address>
				<SMV cbName="svcb" ldInst="Example">
					<Address>
						<P type="MAC-Address">01-0C-CD-04-00-00</P>
						<P type="APPID">0000</P>
						<P type="VLAN-PRIORITY">4</P>
						<P type="VLAN-ID">000</P>
					</Address>
				</SMV>
			</ConnectedAP>
		</SubNetwork>
	</Communication>
	<IED name="ClientIED">
		<AccessPoint name="CAP">
		</AccessPoint>
	</IED>
	<IED configVersion="1.0" name="ServerIED" type="RTUType">
		<AccessPoint name="SAP">
			<Server timeout="30">
				<Authentication/>
			</Server>
		</AccessPoint>
	</IED>
	</SCL>
	\endcode

	接口调用例：
	\code
	IEC61850_ErrorCode result = S_OK;
	result = IEC61850_ClientConnect(client, "./mms-cid/client-direct.xml");	// 'client' is the IEC61850 instance created by IEC61850_Create()
	if (result != S_OK) {
		printf("Failed to connect to server via config file: %s (%d)", IEC61850_ErrorString(result), result);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_ClientConnect(IEC61850 client, const char* cfg);

/*!	\brief	该接口用于客户端直接连接服务端。
	\details
	需要在 IEC61850_Create() 完成之后调用。

	\ingroup	Management

	\param[in]		client	IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		params	连接参数
	\param[in]		iedName	装置名称
	\param[in,out]	aaIndex	返回的服务端连接索引(serverIndex)

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_ErrorCode error = S_OK;
	U32 aaIndex = 0; // serverIndex
	IEC61850_AssociationParameters assocParams = { 0 };
	char* iedName = "exampleIEDName";

	strncpy(assocParams.IPAddress, "192.168.8.1", 16);
	assocParams.port = 102;
	assocParams.callingTSelect = 1;
	assocParams.callingSSelect = 1;
	assocParams.callingPSelect = 1;
	assocParams.callingAEQualifier = 12;
	strncpy(assocParams.callingAPTitle, "1,1,9999,1", 32);
	assocParams.calledTSelect = 1;
	assocParams.calledSSelect = 1;
	assocParams.calledPSelect = 1;
	assocParams.calledAEQualifier = 12;
	strncpy(assocParams.calledAPTitle, "1,1,9999,1", 32);

	error = IEC61850_ClientConnectDirect(client, &assocParams, iedName, &aaIndex);
	if (error != S_OK) {
		printf("Failed to connect to server: %s (%d)", IEC61850_ErrorString(error), error);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_ClientConnectDirect(IEC61850 client, IEC61850_AssociationParameters* params, const char* iedName, U32* aaIndex);

/*!	\brief	该接口用于客户端直接断开连接。
	\details
	需要在 IEC61850_Create()完成之后调用。

	\ingroup	Management

	\param[in]	client	IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	aaIndex	服务端连接的索引(serverIndex)

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>
				失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\remark
	可通过 IEC61850_GetConnectionsList() 接口来查询客户端所连接的服务端的索引。

	\see	IEC61850_GetConnectionsList()

	<b>示例</b>
	\code
	U32 serverIndex = 0;
	IEC61850_ErrorCode error = IEC61850_ClientDisconnectDirect(client, serverIndex);	// 'client' is the IEC61850 instance created by IEC61850_Create()
	if (error != S_OK) {
		printf("Failed to disconnect server: %s (%d)", IEC61850_ErrorString(error), error);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_ClientDisconnectDirect(IEC61850 client, U32 aaIndex);

/*!	\brief	启动 IEC61850 对象的服务
	\details
	需要在 IEC61850_Create() 和 IEC61850_LoadSCLFile() 完成之后调用。<br>
	协议栈会根据加载的模型文件，来启动对应的服务。

	\ingroup	Management

	\param[in]	iec61850	IEC61850 对象

	\return		错误码。<br>启动成功，则返回 #IEC61850_ERROR_NONE (0)；<br>启动失败，则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\see IEC61850_Stop()

	<b>示例</b>
	\code
	IEC61850_ErrorCode error = S_OK;
	error = IEC61850_Start(server);	// 'server' is the IEC61850 instance created by IEC61850_Create()
	if (error != S_OK) {
		printf("Can't start server: %s (%d)", IEC61850_ErrorString(error), error);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_Start(IEC61850 iec61850);

/*!	\brief	停止由 IEC61850_Start() 启动的 IEC61850 对象的服务。
	\ingroup	Management

	\param[in]	iec61850	IEC61850 对象

	\return		错误码。停止成功，则返回 #IEC61850_ERROR_NONE (0)；停止失败，则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\see IEC61850_Start()

	<b>示例</b>
	\code
	IEC61850_ErrorCode error = S_OK;
	error = IEC61850_Stop(server);	// 'server' is the IEC61850 instance created by IEC61850_Create()
	if (error != S_OK) {
		printf("Can't stop server: %s (%d)", IEC61850_ErrorString(error), error);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_Stop(IEC61850 iec61850);

/*!	\brief	该接口用于更新数据属性的值。
	\details
	该接口基于数据属性ID（DAID）来更新数据。 要更新的数据的 DAID ，由 daid 参数指定；要更新的数据值，由 newValue 参数指定。<br>
	要使用该接口更新数据，服务端的模型中需要为数据属性配置 DAID。<br>
	该接口为服务端使用的接口，仅能由服务端调用，客户端禁止调用。

	\ingroup	DataAttributeAccess

	\param[in]	server		IEC61850 对象。<br>对象角色必须是服务端 IEC61850_SERVER
	\param[in]	daid		要更新数据的 DAID。<br>
							更新的数据为多个时，应指定为一个包含多个数据属ID的 `IEC61850_DataAttributeID` 数组的首地址，元素数量通过成员 `count` 指定，且应与成员 `newValue` 的数量一致。
	\param[in]	newValue	要更新的数据属性值。<br>
							更新的数据为多个时，应指定为一个包含多个数据属性值的 `IEC61850_DataAttributeData` 数组的首地址，元素数量通过成员 `count` 指定，且应与成员 `daid` 的数量一致。
	\param[in]	count		更新的数据数量。<br>
							需要与实际更新的数据数量匹配，数量应在 1~128 之间。<br>
							更新的数据为单个时，应指定为 1；<br>
							更新的数据为多个时，应指定为对应的元素数量，数量应该与 `daid` 和 `newValue` 中实际的元素数量一致。

	\return	错误码。<br>
			成功则返回 #IEC61850_ERROR_NONE (0)；<br>
			失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>

	模型中，数据属性ID（DAID）的建模示例：
	\code
	<LN desc="Neutral current regulator" inst="0" lnClass="ANCR" lnType="ANCR_0" prefix="">
		<DOI desc="Single point status" name="Loc">
			<DAI name="stVal" sAddr="@1.2.3.4.5"/>
		</DOI>
	</LN>
	\endcode
		
	<b>更新单个数据示例代码：</b>
	\code
	IEC61850_DataAttributeID daid = { 1, 2, 3, 4, 5 };	// 准备 DAID
	IEC61850_DataAttributeData data = { 0 };	// 准备数据

	Boolean val = TRUE;	// 定义原始数据
	IEC61850_SetDataBoolean(&data, &val);

	IEC61850_ErrorCode error = IEC61850_ERROR_NONE;
	IEC61850 server = GetMyServerClient();   // 获取 IEC61850 对象
	error = IEC61850_Update(server, &daid, &data, 1);	// 通过 DAID 更新数据
	if (error != IEC61850_ERROR_NONE) {
		// 更新失败
	} else {
		// 更新成功
	}
	\endcode

	<b>更新多个数据示例代码：</b>
	\code
	IEC61850_DataAttributeID daid[3] = { {1, 2, 3, 4, 0}, {1, 2, 3, 4, 1}, {1, 2, 3, 4, 2} };
	IEC61850_DataAttributeData val[3] = { 0 };

	Float32 f = (Float32)123.456;
	IEC61850_SetDataFloat32(&val[0], &f);

	tIEC61850Quality q = IEC61850_QUALITY_GOOD;
	IEC61850_SetDataQuality(&val[1], &q);

	IEC61850_TimeStamp t = { 0 };
	IEC61850_GetTime(NULL, &t);
	IEC61850_SetDataTimestamp(&val[2], &t);

	IEC61850_ErrorCode error = IEC61850_ERROR_NONE;
	IEC61850 server = GetMyServerClient();
	error = IEC61850_Update(server, daid, val, 3);
	if (error != IEC61850_ERROR_NONE) {
		// 更新失败
	} else {
		// 更新成功
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_Update(IEC61850 server, IEC61850_DataAttributeID* daid, const IEC61850_DataAttributeData* newValue, unsigned int count);

/*!	\brief	该接口用于实现对数据属性值的更新。
	\details
	该接口为服务端使用的接口，仅能由服务端调用，客户端禁止调用。<br>
	该接口的功能与 IEC61850_Update() 接口相同，区别为，该接口是基于短地址（sAddr）来更新数据的。<br>
	要更新的数据的 sAddr ，由 sAddrList 参数指定；要更新的数据值，由 newValue 参数指定。<br>
	<br>
	要使用该接口更新数据，服务端的模型中需要为数据属性配置 sAddr。<br>
	该接口不支持更新数组数据和数组元素数据。

	\ingroup	DataAttributeAccess

	\param[in]	server		IEC61850 对象。对象角色必须是服务端 IEC61850_SERVER
	\param[in]	sAddrList	要更新数据的 sAddr。<br>
							应指定为包含一个或多个短地址的 char* 数组的首地址，元素数量通过成员 count 指定，且应与成员 newValue 的数量一致。
	\param[in]	newValue	要更新的数据属性值。<br>
							更新的数据为多个时，应指定为一个包含多个数据属性值的 IEC61850_DataAttributeData 数组的首地址，元素数量通过成员 count 指定，且应与成员 sAddrList 的数量一致。
	\param[in]	count		更新的数据数量。<br>
							需要与实际更新的数据数量匹配，数量应在 1~128 之间。<br>
							更新的数据为单个时，应指定为 1；<br>
							更新的数据为多个时，应指定为对应的元素数量，数量应该与 sAddrList 和 newValue 中实际的元素数量一致。

	\return		错误码。<br>更新成功则返回 IEC61850_ERROR_NONE (0)；<br>更新失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>

	模型中短地址（sAddr）的建模示例：
	\code
	<LN desc="Measurement" inst="0" lnClass="MMXU" lnType="MMXU_0" prefix="">
		<DOI desc="" name="A">
			<SDI name="phsA">
				<SDI name="cVal">
				<SDI name="mag">
					<DAI name="i" sAddr="aaa"/>
				</SDI>
				</SDI>
				<DAI name="q" sAddr="bbb"/>
				<DAI name="t" sAddr="ccc"/>
			</SDI>
		</DOI>
	</LN>
	\endcode

	接口调用示例代码：
	\code
	char* sAddr[3] = { "saddr@5.1.1.2.1","saddr@5.1.1.2.2", "saddr@5.1.1.2.3" };
	IEC61850_DataAttributeData val[3] = { 0 };
	S32 i = 123;
	IEC61850_SetDataInt32(&val[0], &i);

	tIEC61850Quality q = IEC61850_QUALITY_INVALID | IEC61850_QUALITY_OVERFLOW;
	IEC61850_SetDataQuality(&val[1], &q);

	IEC61850_TimeStamp t = { 0 };
	IEC61850_GetTime(NULL, &t);
	IEC61850_SetDataTimestamp(&val[2], &t);

	IEC61850_ErrorCode result = IEC61850_UpdateWithShortAddr(GetMyServerClient(), sAddr, val, 3);
	if (result == IEC61850_ERROR_NONE) {
		// 更新成功
	} else {
		// 更新失败
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_UpdateWithShortAddr(IEC61850 server, char** sAddrList, const IEC61850_DataAttributeData* newValue, unsigned int count);

/*!	\brief	该接口用于基于数据属性的引用，来更新数据属性值。
	\details
	该接口为服务端使用的接口，仅能由服务端调用，客户端禁止调用。<br>
	<br>
	该接口的功能与 `IEC61850_Update()` 接口相同，区别为，该接口是基于引用（reference）来更新数据的。<br>
	要更新的数据的引用 ，由 reference 参数指定；<br>
	要更新的数据值，由 newValue 参数指定。<br>

	\remark
	该接口每次仅能更新一个数据点，且该接口不支持更新数组数据和数组元素数据。

	\ingroup	DataAttributeAccess

	\param[in]	server		IEC61850 对象。对象角色必须是服务端 IEC61850_SERVER
	\param[in]	reference	要更新的数据属性的引用
	\param[in]	newValue	要更新的数据属性值

	\return		错误码含义的字符串

	<b>示例</b>
	\code
	char* reference[3] = { "LDName/GGIO0.AnIn1.mag.f", "LDName/GGIO0.AnIn1.q", "LDName/GGIO0.AnIn1.t" };
	IEC61850_DataAttributeData val[3] = { 0 };
	Float32 f = (Float32)123.456;
	IEC61850_SetDataFloat32(&val[0], &f);

	tIEC61850Quality q = IEC61850_QUALITY_QUESTIONABLE | IEC61850_QUALITY_OLDDATA;
	IEC61850_SetDataQuality(&val[0], &q);

	IEC61850_TimeStamp t = { 0 };
	IEC61850_GetTime(NULL, &t);
	IEC61850_SetDataTimestamp(&val[0], &t);

	IEC61850_ErrorCode result = IEC61850_ERROR_NONE;
	for (int i = 0; i < 3; i++) {
		result = IEC61850_UpdateWithReference(GetMyServerClient(), reference[i], &val[i]);
		if (result == IEC61850_ERROR_NONE) {
			// 更新成功
		} else {
			// 更新失败
		}
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_UpdateWithReference(IEC61850 server, char* reference, const IEC61850_DataAttributeData* newValue);

/*!	\brief	该接口用于更新数据属性的值，并同时更新其对应 q 和 t 的值。
	\details
	该接口为可同时更新 q、t 的数据更新接口，<br>
	前提是，被更新的数据属性（例如 stVal）所属的数据对象中，存在 q、t 数据属性，<br>
	并且 q、t 两个数据属性在模型文件中的定义必须相邻，且必须为 q 在前、t 在后的顺序。<br>
	<br>
	该接口可基于任意类型的的数据映射信息（数据属性ID（DAID）/短地址（sAddr）/引用（Reference））来更新数据，<br>
	数据映射信息由 `dataMap` 参数指定，其对应的数据映射模式的类别，由 `mapMode` 参数指定，<br>
	要更新的数据属性的值，及其对应的 q、t 属性的值，由 `newValue` 参数指定。<br>
	<br>
	若要通过 DAID/sAddr 来更新数据，则服务端的模型中需要为数据属性配置 DAID/sAddr。<br>
	（只需为主要更新的数据属性（例如 stVal）配置数据映射信息，q、t 两个数据属性无需配置数据映射信息）<br>
	<br>
	该接口为服务端使用的接口，仅能由服务端调用，客户端禁止调用。

	\ingroup	DataAttributeAccess

	\param[in]	server		IEC61850 对象。对象角色必须是服务端 IEC61850_SERVER
	\param[in]	dataMap		要更新的数据属性的 数据映射信息，例如数据属性ID（DAID）、短地址（sAddr）、引用（Reference）。<br>
							应指定为包含至少一个 `IEC61850_DataAttributeID` 或 `char*` 元素的数组的首地址，<br>
							（必须是同一种类型的数据映射信息，不能是多种类型的混合）<br>
							更新的数据数量由 `count` 参数指定，且应与参数 newValue 包含的数据值数量一致。
	\param[in]	newValue	要更新的数据属性值。<br>
							应指定为包含至少一个 `IEC61850_DataAttributeDataQT` 元素的数组的首地址，<br>
							更新的数据数量由 `count` 参数指定，且应与参数 dataMap 包含的数据映射信息数量一致。
	\param[in]	count		更新的数据数量。<br>
							需要与实际更新的数据数量匹配，即，需要与 newValue 和 dataMap 参数中包含的元素数量一致。<br>
							数量应在 1~128 之间。<br>
							更新的数据为单个时，应指定为 1；<br>
							更新的数据为多个时，应指定为对应的元素数量。
	\param[in]	mapMode		与 dataMap 参数的类型相对应的数据映射模式类别<br>
							dataMap 参数为数据属性ID（DAID）时，需指定为 #IEC61850_MAP_MODE_DAID <br>
							dataMap 参数为短地址（sAddr）时，需指定为 #IEC61850_MAP_MODE_SADDR <br>
							dataMap 参数为引用（Reference）时，需指定为 #IEC61850_MAP_MODE_REFERENCE

	\return	错误码。<br>
			成功则返回 #IEC61850_ERROR_NONE (0)；<br>
			失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>

	模型中，数据属性ID（DAID）的建模示例：
	\code
	<LN desc="Measurement" inst="0" lnClass="MMXU" lnType="MMXU_0" prefix="">
		<DOI desc="Phase to ground related measurement values of a three phase Star" name="A">
			<SDI desc="Complex measured value" name="phsA">
			<SDI name="cVal">
				<SDI name="mag">
					<DAI name="i" sAddr="@3.0.0.0.0"/>
				</SDI>
			</SDI>
			</SDI>
			<SDI desc="Complex measured value" name="phsB">
			<SDI name="cVal">
				<SDI name="mag">
					<DAI name="i" sAddr="@4.0.0.0.0"/>
				</SDI>
			</SDI>
			</SDI>
			<SDI desc="Complex measured value" name="phsC">
			<SDI name="cVal">
				<SDI name="mag">
					<DAI name="i" sAddr="@5.0.0.0.0"/>
				</SDI>
			</SDI>
			</SDI>
		</DOI>
	</LN>
	\endcode

	模板部分必须包含q、t，如下：
	\code
	<LNodeType id="MMXU_0" lnClass="MMXU">
		<DO desc="Phase to ground related measurement values of a three phase Star" name="A" type="WYE_0"/>
	</LNodeType>
	<DOType cdc="WYE" desc="Phase to ground related measurement values of a three phase Star" id="WYE_0">
		<SDO desc="Complex measured value" name="phsA" type="CMV_0"/>
		<SDO desc="Complex measured value" name="phsB" type="CMV_1"/>
		<SDO desc="Complex measured value" name="phsC" type="CMV_2"/>
	</DOType>
	<DOType cdc="CMV" desc="Complex measured value" id="CMV_0">
		<DA bType="Struct" dchg="true" dupd="true" fc="MX" name="cVal" type="cVal_0"/>
		<DA bType="Quality" fc="MX" name="q" qchg="true"/>
		<DA bType="Timestamp" fc="MX" name="t"/>
	</DOType>
	<DAType id="cVal_0">
		<BDA bType="Struct" name="mag" type="mag_0"/>
	</DAType>
	<DAType id="mag_0">
		<BDA bType="INT32" name="i"/>
	</DAType>
	\endcode

	更新数据示例代码：
	\code
	IEC61850_ErrorCode result = S_OK;
	IEC61850 server = GetMyServerClient();
	IEC61850_DataMapMode mapMode = IEC61850_MAP_MODE_DAID;
	IEC61850_DataAttributeID daid[3] = {
		{3, 0, 0, 0, 0},
		{4, 0, 0, 0, 0},
		{5, 0, 0, 0, 0}
	};
	IEC61850_DataAttributeDataQT newValue[3] = { 0 };

	S32 value1 = 123;
	tIEC61850Quality q1 = IEC61850_QUALITY_FAILURE;
	IEC61850_TimeStamp t1 = { 0 };

	S32 value2 = 456;
	tIEC61850Quality q2 = IEC61850_QUALITY_OVERFLOW;
	IEC61850_TimeStamp t2 = { 0 };

	S32 value3 = 789;
	tIEC61850Quality q3 = IEC61850_QUALITY_OUTOFRANGE;
	IEC61850_TimeStamp t3 = { 0 };

	IEC61850_GetTime(NULL, &t1);
	IEC61850_GetTime(NULL, &t2);
	IEC61850_GetTime(NULL, &t3);

	newValue[0].dataVal.bitLength = sizeof(S32) * 8;
	newValue[0].dataVal.type = IEC61850_DATATYPE_INT32;
	newValue[0].dataVal.pvData = &value1;
	newValue[0].q = &q1;
	newValue[0].t = &t1;

	newValue[1].dataVal.bitLength = sizeof(S32) * 8;
	newValue[1].dataVal.type = IEC61850_DATATYPE_INT32;
	newValue[1].dataVal.pvData = &value2;
	newValue[1].q = &q2;
	newValue[1].t = &t2;

	newValue[2].dataVal.bitLength = sizeof(S32) * 8;
	newValue[2].dataVal.type = IEC61850_DATATYPE_INT32;
	newValue[2].dataVal.pvData = &value3;
	newValue[2].q = &q3;
	newValue[2].t = &t3;

	result = IEC61850_UpdateWithQT(server, daid, newValue, 3, mapMode);
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_UpdateWithQT(IEC61850 server, void* dataMap, IEC61850_DataAttributeDataQT* newValue, unsigned int count, IEC61850_DataMapMode mapMode);

/*!	\brief	该接口用于返回错误码 `IEC61850_ErrorCode` 枚举值所对应含义的字符串。
	\ingroup	Support

	\param[in]	code	错误码的枚举值 #IEC61850_ErrorCode

	\return		错误码含义的字符串
*/
PIS10_API const char* IEC61850_ErrorString(IEC61850_ErrorCode code);

/*!	\brief	获取 YX-PIS 协议栈的版本号
	\ingroup	Support

	\return	接口用于获取 YX-PIS 协议栈的版本号。<br>该接口无入参，返回值是协议栈版本号宏值 YX_PIS_VERSION 对应的字符串,例如 "VX.X.X.X" 
*/
PIS10_API  const char* IEC61850_GetLibraryVersion();

/*!	\brief	获取 YX-PIS 协议栈库的构建时间
	\ingroup	Support

	\return	返回值是一个代表时间的字符串，其内容格式与协议栈的运行环境有关。例如 `Feb  3 2020 12:34:56`。
*/
PIS10_API const char* IEC61850_GetLibraryBuildTime();

/*!	\brief	该接口用于设置时间品质。
	\details
	该接口各个参数的意义，同 IEC61850_GetTimeQuality() 接口。<br>
	前三个参数 `leapSecondKnown`、`clockFailure`、`clockNotSynchronized` 依次代表时间品质的 0、1、2 三个 bit 位。<br>
	若这三个参数传入非 0 值，则时间品质对应的标志位将被置为 1，反之则置为 0；<br>
	第四个参数 `timeAccuracyOfFractionsOfSecond` 为时间品质第 3~7 bit 位所代表的时间精确度。<br>
	若该参数传入 0~24 之间（包含 0 和 24）的值，则时间精度将被设置为对应的值；<br>
	若该参数传入小于 0 的值，则时间精确度将被设置为 "未规定"；<br>
	该参数传入其他值将视为参数无效。

	\ingroup	Time

	\param[in]	leapSecondKnown					闰秒已知（LeapSecondsKnown）
	\param[in]	clockFailure					时钟故障（ClockFailure）
	\param[in]	clockNotSynchronized			时钟未同步（ClockNotSynchronized）
	\param[in]	timeAccuracyOfFractionsOfSecond	"秒的小数" 的时间精确度（TimeAccuracy）

	\return		错误码。<br>设置成功则返回 IEC61850_ERROR_NONE (0)；<br>设置失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\attention
	该接口设置的时间品质是全局的，将被应用于 IEC61850_GetTime() 、IEC61850_GetIEC61850TimeFromDate() 等接口所获取的时间中。

	\see	IEC61850_GetTimeQuality()

	<b>示例</b>
	\code
	IEC61850_ErrorCode error = IEC61850_SetTimeQuality(1, 0, 1, -1);
	if (error != S_OK) {
		printf("IEC61850_SetTimeQuality failed: %s", IEC61850_ErrorString(error));
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetTimeQuality(char leapSecondKnown, char clockFailure, char clockNotSynchronized, int timeAccuracyOfFractionsOfSecond);

/*!	\brief	该接口用于获取时间品质。
	\details
	时间品质是一个 8 位的位串（BIT STRING）数据。 （每个 bit 位的意义，可参照 IEC61850_TimeStamp 的 "时间品质" 的说明）<br>
	该接口将时间品质信息拆分为了以一系列值，以不同的参数传出。<br>
	第一个参数 leapSecondKnown 将传出时间品质 bit 位 0 的 "闰秒已知"。如果闰秒已知，则为非 0 值，否则为 0 值；<br>
	第二个参数 clockFailure 将传出时间品质 bit 位 1 的 "时钟故障"。若时钟故障，则为非 0 值，否则为 0 值；<br>
	第三个参数 clockNotSynchronized 将传出时间品质 bit 位 2 "时钟未同步"。若时钟未同步，则为非 0 值，否则为 0 值；<br>
	第四个参数 timeAccuracyOfFractionsOfSecond 将传出时间品质 bit 位 3~7 的 "时间精确度"，<br>
	若该值在 0~24 之间（包含 0 和 24），则时间精确度为数值对应的意义；若该值为小于 0 的负值，则代表时间精确度为 "未规定"。

	\ingroup	Time

	\param[in,out]	leapSecondKnown					闰秒已知（LeapSecondsKnown）
	\param[in,out]	clockFailure					时钟故障（ClockFailure）
	\param[in,out]	clockNotSynchronized			时钟未同步（ClockNotSynchronized）
	\param[in,out]	timeAccuracyOfFractionsOfSecond	"秒的小数" 的时间精确度（TimeAccuracy）

	\return	错误码。<br>获取成功则返回 IEC61850_ERROR_NONE (0)；<br>获取失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\see	IEC61850_SetTimeQuality()

	<b>示例</b>
	\code
	char leapSecondKnown = 0;
	char clockFailure = 0;
	IEC61850_ErrorCode error = IEC61850_GetTimeQuality(&leapSecondKnown, &clockFailure, NULL, NULL);
	if (error != S_OK) {
		printf("IEC61850_GetTimeQuality failed: %s", IEC61850_ErrorString(error));
	} else {
		printf(" LeapSecondKnown: [%s]\n", (Boolean)leapSecondKnown ? "TRUE" : "FALSE");
		printf(" ClockFailure:    [%s]\n", (Boolean)clockFailure ? "TRUE" : "FALSE");
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetTimeQuality(char* leapSecondKnown, char* clockFailure, char* clockNotSynchronized, int* timeAccuracyOfFractionsOfSecond);

/*!	\brief	该接口用于获取当前的系统时间对应的 IEC61850 时间戳。
	\details
	获取的时间戳，将被写入由 currentTime 参数指定的 IEC61850_TimeStamp 数据中。<br>
	YX-PIS 协议栈内部也会使用 IEC61850_GetTime() 来获取时间。<br>
	通过 IEC61850_SetTimeQuality() 接口设置的时间品质，会应用到该接口传出的时间戳中。<br>
	<br>
	若用户指定了 #IEC61850_TimeStampCallback 回调函数，则 currentTime 参数将返回由 #IEC61850_TimeStampCallback 回调函数提供的时间。

	\ingroup	Time

	\param[in]		iec61850	IEC61850 对象，该参数传 NULL 即可。
	\param[in,out]	currentTime	返回的当前时间

	\return		错误码。<br>获取成功则返回 IEC61850_ERROR_NONE (0)；<br>获取失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_TimeStamp time = { 0 };
	IEC61850_GetTime(NULL, &time);
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetTime(IEC61850 iec61850, IEC61850_TimeStamp* currentTime);

/*!	\brief	该接口用于设置系统时间，可用于实现对装置系统时钟的对时。
	\details
	该接口通过 IEC61850 时间戳 `IEC61850_TimeStamp` 来指定设置的时间，<br>
	且仅会设置时间（使用 `IEC61850_TimeStamp` 中 秒的整数 和 秒的小数 的数据来设置时间），不会设置时间品质。

	\ingroup	Time

	\param[in]	time	设定的时间

	\return		错误码。<br>设置成功则返回 IEC61850_ERROR_NONE (0)；<br>设置失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\attention
	由于时间同步与对时不属于 IEC61850 的实现范畴，<br>
	该接口目前仅在极个别类型的嵌入式系统(例如 BECK)环境下可用，其他系统环境下均不可用。

	<b>示例</b>
	\code
	IEC61850_TimeStamp time = { 0 };
	time.seconds = 455896518;
	time.fractionsOfSecond = 0;
	if (IEC61850_SetTime(&time) != S_OK) {
		printf("Set Time failed");
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetTime(IEC61850_TimeStamp* time);

/*!	\brief	该接口用于为 IEC61850 对象指定自定义的用户数据。
	\details
	指定的自定义用户数据，可在该 IEC61850 对象的回调函数被调用时，通过回调函数的首个参数 `userData` 来访问使用。

	\ingroup	Support

	\param[in]	iec61850	IEC61850 对象。用于指定 IEC61850_Create() 创建的 IEC61850 对象
	\param[in]	data		用户自定义数据地址。需确保此地址始终有效，建议使用全局静态数据，或堆创建（calloc/malloc）的数据。

	\return		错误码。设置成功则返回 #IEC61850_ERROR_NONE (0)，设置失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\attention
	自定义用户数据的生命周期不由协议栈维护，不会被 `IEC61850_Free()` 释放，需要自行管理其生命周期。

	<b>示例</b>
	\code
	struct UserData {
		char ref[130];
		int data;
	};
	static struct UserData userData = { 0 };
	IEC61850_ErrorCode error = S_OK;
	error = IEC61850_SetUserData(server, &userData);
	if (error != S_OK) {
		printf("set user data failed: %s", IEC61850_ErrorString(error));
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetUserData(IEC61850 iec61850, void* data);

/*!	\brief	该接口用于获取指定 DAID 所对应数据属性的数据类型。
	\ingroup	DataAttributeAccess

	\param[in]		iec61850		IEC61850 对象
	\param[in]		daid			数据属性的 DAID
	\param[in,out]	returnedType	需要使用一个非 NULL 的 IEC61850_DataAttributeData 作为输入

	\return		错误码。<br>获取成功则返回 IEC61850_ERROR_NONE (0)；<br>获取失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetType(IEC61850 iec61850, IEC61850_DataAttributeID* daid, IEC61850_DataAttributeData* returnedType);

/*!	\brief	操作前选择。（基于 sAddr）
	\details
	控制服务接口。用于对指定 sAddr 的控制对象执行操作前选择（Select / SelectWithValue）命令。<br>
	该接口的功和使用方法，与 `IEC61850_ControlSelect()` 接口相同，只是第二个参数由控制对象的 DAID 更换为了 sAddr。<br>
	该接口可与同以短地址为参数的控制服务接口 `IEC61850_ControlOperateWithShortAddr()`、`IEC61850_ControlCancelWithShortAddr()` 配合使用。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	Control

	\param[in]	client		IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]	sAddr		控制对象状态值的短地址（sAddr）
	\param[in]	selectValue	操作前选择命令的控制值。<br>即，带值选择（SelectWithValue）SBOes 控制对象的控制值（ctlVal）；<br>对于选择（Select）SBOns 控制对象的场合，应指定为 NULL。
	\param[in]	param		控制参数。<br>用于指定控制请求的 同期检查（SynchroCheck）、互锁检查（Interlock\-Check）、测试（Test）属性，以及 "时间激活" 控制的激活时间（operTm）。

	\return	错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_ControlSelectWithShortAddr(IEC61850 client, char* sAddr, IEC61850_DataAttributeData* selectValue, IEC61850_ControlParameters *param);
	
/*!	\brief	操作。（基于 sAddr）
	\details
	控制服务接口。用于对指定 sAddr 的控制对象执行操作（Operate / TimeActivatedOperate）命令。<br>
	该接口的功和使用方法，与 `IEC61850_ControlOperate()` 接口相同，只是第二个参数由控制对象的 DAID 更换为了 sAddr。<br>
	该接口可与同以短地址为参数的控制服务接口 `IEC61850_ControlSelectWithShortAddr()`、`IEC61850_ControlCancelWithShortAddr()` 配合使用。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	Control

	\param[in]	client			IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]	sAddr			控制对象状态值的短地址（sAddr）
	\param[in]	operateValue	操作命令的控制值<br>操作 SBOes 控制对象时，需要与带值选择（SelectWithVal）命令的控制值一致。
	\param[in]	param			控制参数。<br>用于指定控制请求的 同期检查（SynchroCheck）、互锁检查（Interlock\-Check）、测试（Test）属性，以及时间激活控制的操作时间（operTm）。<br>操作 SBOns / SBOes 控制对象时，需要与操作前选择（Select / SelectWithVal）命令的控制参数一致。

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_ControlOperateWithShortAddr(IEC61850 client, char* sAddr, IEC61850_DataAttributeData* operateValue, IEC61850_ControlParameters *param);
	
/*!	\brief	取消。（基于 sAddr）
	\details
	控制服务接口。用于对指定 sAddr 的控制对象执行取消（Cancel）命令。<br>
	该接口的功和使用方法，与 `IEC61850_ControlCancel()` 接口相同，只是第二个参数由控制对象的 DAID 更换为了 sAddr。<br>
	该接口可与同以短地址为参数的控制服务接口 `IEC61850_ControlSelectWithShortAddr()`、`IEC61850_ControlOperateWithShortAddr()` 配合使用。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	Control

	\param[in]	client		IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]	sAddr		控制对象状态值的短地址（sAddr）
	\param[in]	cancelValue	取消命令的控制值。<br>需要与要被取消的控制命令（SelectWithVal / TimeActivatedOperate）的控制值一致。<br>取消对 SBOns 控制对象的操作前选择（Select）时，应指定为 NULL。
	\param[in]	param		控制参数。<br>用于指定控制请求的 同期检查（SynchroCheck）、互锁检查（Interlock\-Check）、测试（Test）属性，以及时间激活控制的操作时间（operTm）。<br>需要与要被取消的控制命令（Select / SelectWithVal / TimeActivatedOperate）的控制参数一致。

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_ControlCancelWithShortAddr(IEC61850 client, char* sAddr, IEC61850_DataAttributeData* cancelValue, IEC61850_ControlParameters* param);
	
/*!	\brief	操作前选择。（基于 DAID）
	\details
	控制服务接口。用于对指定 DAID 的控制对象执行操作前选择命令。<br>
	对应的 ACSI 服务接口为：\"Select\" / \"SelectWithValue\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。<br>
	<br>
	该接口仅应用于 操作前选择（SBOns / SBOes）的控制对象，不能用于 直接控制（DOns / DOes）的控制对象。<br>
	若控制值参数 selectValue 为 NULL，则执行适用于 SBOns 控制对象的 选择（Select）命令； <br>
	若控制值参数 selectValue 有被设置，则执行适用于 SBOes 控制对象的 带值选择（SelectWithValue）命令。<br>
	<br>
	控制对象被选择成功后，将由未选择（Unselected）状态变为准备就绪（Ready）状态，同时，选择超时计时器将开始计时，<br>
	若超时之前没有对其执行后续的操作命令，其选择状态会因选择超时而被取消，控制对象会复归为未选择（Unselected）状态，再次控制需要重新对其执行操作前选择。<br>
	选择超时的时限，由控制对象的 sboTimeout 数据属性指定。若未明确指定 sboTimeout 时间，则默认为 30 秒。

	\ingroup 	Control

	\param[in]	client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	daid		控制对象的数据属性ID（DAID）。
							CMS 版本的控制命令，不依赖于控制对象的 "控制值" 数据属性模型，
							需指定该参数为控制对象 "状态值" 的数据属性ID（DAID）。
	\param[in]	selectValue	操作前选择命令的控制值。
							该参数用于为 "增强安全的操作前选择(SBOes)" 控制对象，指定 "带值的操作前选择(SelectWithValue)" 的 "控制值(ctlVal)"。
							对于 "常规安全的操作前选择(SBOns)" 控制对象，该值应设置为 NULL；
	\param[in]	param		控制参数。
							用于指定控制请求的 同期检查（SynchroCheck）、互锁检查（Interlock-Check）、测试（Test）属性。

	\return		错误码。<br>选择成功则返回 IEC61850_ERROR_NONE (0)；<br>选择失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_ControlSelect(IEC61850 client, IEC61850_DataAttributeID* daid, IEC61850_DataAttributeData* selectValue, IEC61850_ControlParameters* param);
	
/*!	\brief	操作。（基于 DAID） 
	\details
	控制服务接口。用于对指定 DAID 的控制对象执行操作命令。<br>
	对应的 ACSI 服务接口为：\"Operate\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。<br>
	对于 SBOns / SBOes 的控制对象，应该在调用本接口之前，先调用 IEC61850_ControlSelect() 接口对其执行操作前选择。<br>
	选择成功后才可以对其执行操作命令，操作命令需要在选择超时之前执行。同时，操作命令附带的控制值和控制参数，也需要与操作前选择命令（Select / SelectWithValue）中的一致。

	\ingroup	Control

	\param[in]	client			IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	daid			控制对象的数据属性ID（DAID）。
								CMS 版本的控制命令，不依赖于控制对象的 "控制值" 数据属性模型，
								需指定该参数为控制对象 "状态值" 的数据属性ID（DAID）。
	\param[in]	operateValue	操作命令的控制值
								对于操作 "增强安全的操作前选择(SBOes)" 控制对象的情况，该值需要与 "操作前选择" 命令指定的控制值一致。
	\param[in]	param			控制参数。
								用于指定控制请求的 同期检查（SynchroCheck）、互锁检查（Interlock-Check）、测试（Test）属性。

	\return		错误码。<br>选择成功则返回 IEC61850_ERROR_NONE (0)；<br>选择失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_ControlOperate(IEC61850 client, IEC61850_DataAttributeID* daid, IEC61850_DataAttributeData* operateValue, IEC61850_ControlParameters* param);
	
/*!	\brief	取消。（基于 DAID）
	\details
	控制服务接口。用于对指定 DAID 的控制对象执行取消（Cancel）命令。<br>
	对应的 ACSI 服务接口为：\"Cancel\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。<br>
	该接口可用于取消对控制对象的操作前选择（Select / SelectWithValue）。<br>
	取消命令附带的控制值和控制参数，需要与要被取消的控制命令（Select / SelectWithValue / TimeActivatedOperate）的控制值和控制参数一致。

	\ingroup 	Control

	\param[in]	client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	daid		控制对象的数据属性ID（DAID）。
							CMS 版本的控制命令，不依赖于控制对象的 "控制值" 数据属性模型，
							需指定该参数为控制对象 "状态值" 的数据属性ID（DAID）。
	\param[in]	cancelValue	操作命令的控制值
							对于操作 "增强安全的操作前选择(SBOes)" 控制对象的情况，该值需要与 "操作前选择" 命令指定的控制值一致。
	\param[in]  param		控制参数

	\return		错误码。<br>选择成功则返回 IEC61850_ERROR_NONE (0)；<br>选择失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_ControlCancel(IEC61850 client, IEC61850_DataAttributeID* daid, IEC61850_DataAttributeData* cancelValue, IEC61850_ControlParameters* param);
	
/*!	\brief	命令终止。
	\details
	控制服务接口。用于对指定 DAID 的控制对象，手动触发命令终止（CommandTermination）请求的上送。<br>
	对应的 ACSI 服务接口为：\"CommandTermination\"。<br>
	该接口为服务端使用的接口，客户端禁止调用。<br>
	由于 CommandTermination 是增强安全的控制流程特有的，<br>
	因此该接口仅适用于增强安全（DOes / SBOes）的控制流程，且只能在控制对象处于控制流程最后的 WaitForChange 状态时调用。常规安全（DOns / SBOns）的控制流程禁止调用。<br>
	该接口实际无需使用，因为目前协议栈会自动触发 CommandTermination 请求的上送，无需靠主动调用该接口来触发。

	\ingroup	Control

	\param[in]	server		IEC61850 对象。对象角色必须是服务端 IEC61850_SERVER
	\param[in]	dataMap		控制对象 状态值 的 DAID。
							应指定为 const IEC61850_DataAttributeID* 类型的 DAID。
							应与同一控制序列的控制请求所使用的数据属性映射类型保持一致。
	\param[in]	addCause	命令终止的附加原因（AddCause）
							对于成功的操作结果，需指定为 #IEC61850_COMMAND_ERROR_ADD_CAUSE_NONE ；
							对于失败的操作结果，应按需指定为适用于当下控制状态机的合理 AddCause。

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_ErrorCode result = S_OK;
	IEC61850_DataAttributeID daid = {1, 3, 3, 7, 0};
	eCommandAddCause addCause = IEC61850_COMMAND_ERROR_ADD_CAUSE_UNKNOWN;

	// Set the Command Termination cause, from  eCommandAddCause in the API
	addCause = IEC61850_COMMAND_ERROR_ADD_CAUSE_NONE;

	// Call the API to send the Command Termination for the given control
	result =  IEC61850_ControlTerminateCommand(myIEC61850Server, &daid, addCause);
	if (result == S_OK) {
		printf("Manual Command Termination sent Successfully\n");
	} else {
		printf("Sending Command Termination Failed: %i: %s\n", result, IEC61850_ErrorString(result));
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_ControlTerminateCommand(IEC61850 server, void* dataMap, eCommandAddCause addCause);

/*!	\brief	该接口用于打印数据属性ID（DAID）
	\details
	打印输出的内容例：Generic protocol: 0, 0, 0, 0, 0

	\ingroup	DataAttributeAccess

	\param[in]	daid	数据属性ID（DAID） #IEC61850_DataAttributeID
*/
PIS10_API void IEC61850_PrintDataAttributeID(const IEC61850_DataAttributeID* daid);

/*!	\brief	该接口用于将指定的日期时间转换为 IEC61850 时间戳 IEC61850_TimeStamp
	\details
	转换后的 IEC61850 时间戳，将被写入由 outTimestamp 参数指定的 IEC61850_TimeStamp 数据中；<br>
	要被转换的日期时间通过其他的各个参数传入。<br>
	<br>
	通过 IEC61850_SetTimeQuality() 接口设置的时间品质，会应用到该接口传出的时间戳中。

	\ingroup	Time

	\param[in,out]	outTimestamp	IEC61850 的时间戳
	\param[in]		month			月。取值应为 1~12
	\param[in]		day				日。取值应为 1~31
	\param[in]		year			年。取值应大于等于 1970
	\param[in]		hour			时。取值应为 0~23
	\param[in]		minute			分。取值应为 0~59
	\param[in]		second			秒。取值应为 0~59
	\param[in]		microseconds	微秒。取值应为 0~999999

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	U8 month = 7;
	U8 day = 31;
	U16 year = 2015;
	U8 hour = 6;
	U8 minute = 4;
	U8 second = 44;
	U32 microseconds = 0;

	IEC61850_TimeStamp time = { 0 };
	IEC61850_ErrorCode error = IEC61850_GetIEC61850TimeFromDate(&time, month, day, year, hour, minute, second, microseconds);
	if (error != S_OK) {
		printf("Failed to convert time: %s (%d)", IEC61850_ErrorString(error), error);
	} else {
		printf(" Seconds since Epoch = %u \n", time.seconds);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetIEC61850TimeFromDate(IEC61850_TimeStamp* outTimestamp, U8 month, U8 day, U16 year, U8 hour, U8 minute, U8 second, U32 microseconds);


/*!	\brief	该接口用于将指定的 IEC61850 时间戳 IEC61850_TimeStamp 转换为日期时间 IEC61850_DateTime （年、月、日、时、分、秒、微秒）。
	\details
	指定的 IEC61850 时间戳由 inTimestamp 参数传入；<br>
	转换后的日期时间，将被写入由 outDateTime 参数指定的 IEC61850_DateTime 数据中。

	\ingroup 	Time

	\param[in,out]	outDateTime	日期时间
	\param[in]		inTimestamp	IEC61850 的时间戳

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	// Get Readable Date Time
	IEC61850_ErrorCode error = S_OK;
	IEC61850_DateTime myDateTime;
	IEC61850_TimeStamp  IEC61850Time;

	memset(&myDateTime, 0, sizeof(IEC61850_DateTime));
	memset(&IEC61850Time, 0, sizeof(IEC61850_TimeStamp));

	IEC61850Time.seconds = 1438322683;

	//Get Date from IEC61850 Time Stamp
	error = IEC61850_GetDateFromIEC61850Time(&myDateTime, &IEC61850Time);
	if (error != S_OK) {
		printf("Failed to Convert time: %s (%d)", IEC61850_ErrorString(error), error);
	} else {
		printf(" %02u/%02u/%u %02u:%02u:%02u \n", myDateTime.month, myDateTime.tm_mday, myDateTime.year, myDateTime.tm_hour, myDateTime.tm_min, myDateTime.tm_sec);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDateFromIEC61850Time(IEC61850_DateTime* outDateTime, const IEC61850_TimeStamp* inTimestamp);

/*!	\brief	控制服务接口。用于设置客户端控制命令发起者信息（发起者角色(orCat) 和 发起者标识(orIdent)）。
	\details
	该接口为客户端使用的接口，服务端禁止调用。<br>
	每个客户端对应的控制命令发起者信息，通常是单一且固定不变的，<br>
	可以在创建了客户端的 IEC61850 对象，并加载完模型文件之后，在启动客户端之前调用该接口，并指定 controlID 参数为 NULL，进行统一设置。

	\ingroup	Control

	\param[in]	client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	controlID	控制对象 状态值 的 DAID。
							若指定为具体的 DAID，则设置的发起者信息将应用于指定的控制对象；
							若指定为 NULL，则设置的发起者信息将应用于所有的控制对象。
	\param[in]	orCat		控制命令的发起者角色（orCat）
	\param[in]	orIdent		控制命令的发起者标识（orIdent）。
							指定该值为 NULL 时，会默认将发起者标识设置为客户端的 IP 地址。
	\param[in]	orIdentSize	控制命令的发起者标识数据大小

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_DataAttributeID daid = { 2, 1, 0, 0, 0 };	
	char orIdent[] = "192.168.1.100";	// set orIdent as IP address
	orIdentSize = 13;	// the size of orIdent

	IEC61850_ErrorCode result = IEC61850_SetOriginator(client, &daid, ORCAT_BAY_CONTROL, orIdent, orIdentSize);
	if (result == S_OK) {
		printf("Set originator success\n");
	} else {
		printf("Set originator failed: (%d) %s\n", result, IEC61850_ErrorString(result));
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetOriginator(IEC61850 client, IEC61850_DataAttributeID* controlID, eOriginatorCat orCat, char* orIdent, U8 orIdentSize);

/*!	\brief	该接口用于获取连接状态信息。
	\details
	iec61850 参数用于指定要确认连接状态的客户端或服务端对象， 若对象角色是客户端 IEC61850_CLIENT，<br>
	则 connectionList 内容为客户端模型中引用的各个服务端（ServerIED）的连接状态列表； <br>
	若对象角色是服务端 IEC61850_SERVER，则 connectionList 内容为当前与服务端处于关联成功状态的客户端的列表。

	\ingroup	Support

	\param[in]		iec61850		IEC61850 对象
	\param[in,out]	connectionList	与 `iec61850` 对应的连接状态信息列表

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\remark
	服务端获取的 connectionList->connections[index].iedName 无值

	<b>示例</b>
	\code
	IEC61850_ErrorCode error = S_OK;
	ConnectionList connectionList = { 0 };

	// Request the list from the server, passing in a pointer to the above pointer.
	error = IEC61850_GetConnectionsList(iec61850, &connectionList);
	if (error == S_OK) {
		if (connectionList.length > 0)) {
			U32 index = 0;
			// Print the list
			printf("\n\tConnected Servers (%u):\n", connectionList.length);
			printf("\tIndex\tIED Name\t\tIP address\tConnection Status\n");
			for(index = 0; index < connectionList.length; index++) {
				printf("\t%u\t%s\t%s\t%s\n",
					connectionList.connections[index].AAIndex,
					connectionList.connections[index].iedName,
					connectionList.connections[index].IPAddress,
					connectionList.connections[index].bConnectionState ? "Connected" : "Disconnected");
			}
		} else {
			printf("\n\t No remote connections present\n");
		}
	} else {
		printf(strError, SIZE_OF_ERROR_STRING, "Get Connections list failed: %i: %s\n", error, IEC61850_ErrorString(error));
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetConnectionsList(IEC61850 iec61850, ConnectionList* connectionList);
	
/*!	\brief	该接口用于获取指定 数据属性ID(DAID) 对应数据属性的数据值。
	\details
	该接口为服务端使用的接口，客户端禁止调用。

	\ingroup	DataAttributeAccess

	\param[in]		server			IEC61850 对象。对象角色必须是服务端 IEC61850_SERVER
	\param[in]		daid			数据属性ID
	\param[in,out]	outReturnValue	数据值

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDataAttributeData(IEC61850 server, IEC61850_DataAttributeID* daid, IEC61850_DataAttributeData* outReturnValue);

/*!	\brief		该接口用于获取模型中配置有 DAID 的数据属性信息。
	\details
	该接口服务端和客户端均可以调用，获取到的数据属性信息由 outDataPointInfoArr 参数传出。<br>
	不同的角色调用，outDataPointInfoArr 的内容会有所不同，具体参照参数的说明。

	\ingroup 	DataAttributeAccess

	\param[in]		iec61850		IEC61850 对象
	\param[in,out]	outDAInfoArr	数据属性信息。
									若该参数为 NULL，则 outArrSize 参数将返回模型文件中所有配置了 DAID 的数据属性的总数量减1。（假设模型中有 20 个数据属性配置有 DAID，则该值将返回 19）；
									若该参数不为 NULL，则应为一个容量不小于 outArrSize 的 struct DAInfo 数组的首地址。
									若 iec61850 参数为服务端 IEC61850_SERVER，则获取到的 outDataPointInfoArr 中，会附带数据属性值，且数据属性的名称为 ObjectName（例如 stVal）；
									若 iec61850 参数为客户端 IEC61850_CLIENT，则获取到的 outDataPointInfoArr 中，不会附带据属性值（数据属性值为 NULL），且数据属性的名称为从逻辑设备名称开始的相对引用，其中的数据属性连接符是 $ ，例如 "CSWI0.Pos\$stVal"。
	\param[in,out] outArrSize		数据属性数量。
									若 outDataPointInfoArr 参数为 NULL，则该参数返回的数值，为模型文件中所有配置了 DAID 的数据属性总数量减1。即，假设模型中有给 10 个数据属性配置 DAID，则返回的该参数值为 9；
									若 outDataPointInfoArr 参数不为 NULL，则该参数代表从 startAt 参数指定索引开始的、当次请求所能够返回的最大数据属性数量。接口返回后，该入参值将被实际返回的数据属性数量替代。
	\param[in]		startAt			起始索引。
									用于指定返回的数据属性从第几个开始。
									初始索引值从 0 开始，值不能超过可以返回的数据属性总数量减1。

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	DAInfo daInfoArr[50] = { 0 };
	U32 totalDataPoints = 0;
	U32 daArrSize = 0;
	U32 continueAfter = 0;
	U32 i = 0;

	IEC61850_ErrorCode error = IEC61850_GetDataAttributesInfo(iec61850, NULL, &totalDataPoints, 0);

	printf("Number of Data attributes %u \n", totalDataPoints);

	while (continueAfter < totalDataPoints) {
		daArrSize = 50;
		IEC61850_GetDataAttributesInfo(iec61850, daInfoArr, &daArrSize, continueAfter);
		continueAfter += daArrSize;

		for (i = 0; i < daArrSize; i++) {
			//Print Item Name
			printf("Name: %s\n", daInfoArr[i].name);
			IEC61850_PrintDataAttributeID(daInfoArr[i].DAID);
			printf("\n");
		}
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDataAttributesInfo(IEC61850 iec61850, DAInfo* outDAInfoArr, U32* outArrSize, U32 startAt);

/*!	\brief	该接口用于释放动态分配的日志条目列表。
	\details
	主要用于释放 IEC61850_QueryLogByTime() 和 IEC61850_QueryLogAfter() 接口的响应数据。

	\ingroup	LCB

	\param[in]	logger	日志条目列表

	\return		无返回值
*/
PIS10_API void IEC61850_FreeLogEntries(IEC61850_LogEntries* logger);

/*!	\brief	该接口用于释放动态分配的日志状态列表。
	\details
	主要用于释放 IEC61850_GetLogStatusValues() 接口的响应数据。

	\ingroup	LCB

	\param[in,out]	resultList	日志状态列表

	\return		无返回值
*/
PIS10_API void FreeLogStatusList(IEC61850_GetLogStatus_ResultList* resultList);

/*!	\brief	该接口用于释放动态分配的数据值列表。
	\details
	主要用于释放 IEC61850_GetEditSGValue()、IEC61850_GetDataValues()、IEC61850_GetDataSetValues() 接口的响应数据。

	\ingroup	DataAttributeAccess

	\param[in,out]	dataVals	数据值列表

	\return		无返回值
*/
PIS10_API void IEC61850_FreeDataValsList(DataValsList* dataVals);

/*!	\brief	该接口用于释放动态分配的数据定义列表。
	\details
	主要用于释放 IEC61850_GetAllDataDefinition()、IEC61850_GetDataDefinition() 接口的响应数据。

	\ingroup	DataAttributeAccess

	\param[in,out]	definitions	数据定义列表

	\return		无返回值
*/
PIS10_API void FreeDataDefinitions(DataDefinitions* definitions);

/*!	\brief	该接口用于释放动态分配的数据定义。
	\details
	该接口被 `FreeDataDefinitions()` 接口所使用，用于递归释放数据定义列表中的数据定义。

	\ingroup	DataAttributeAccess

	\param[in,out]	definition	数据定义

	\return		无返回值
*/
PIS10_API void FreeDataDefinition(DataDefinition* definition);

/*!	\brief	该接口用于释放获取的所有控制块值。
	\ingroup	cbValues

	\param[in,out]	cbValues	控制块值

	\return		无返回值
*/
PIS10_API void FreeAllCBValues(GetAllCBValsReturn* cbValues);

/*!	\brief	该接口用于释放动态分配的数据目录列表。
	\ingroup	DataAttributeAccess

	\param[in]	directoryList	数据目录列表

	\return		无返回值
*/
PIS10_API void IEC61850_FreeDataDirList(DataDirectoryList* directoryList);

/*!	\brief	该接口用于释放动态分配的定值组控制块值列表该接口用于释放动态分配的带功能约束的数据属性（FCDA）列表。
	\details
	主要用于释放 IEC61850_GetDataSetDirectory() 接口的响应数据。

	\ingroup	DataSet

	\param[in,out]	fcdaList	带功能约束的数据属性（FCDA）列表

	\return		无返回值
*/
PIS10_API void FreeFCDAList(FCDAList* fcdaList);

/*!	\brief	该接口用于释放动态分配的定值组控制块值列表。
	\details
	主要用于释放 IEC61850_GetSGCBValues() 接口的响应数据。

	\ingroup	SGCB

	\param[in,out]	valueList	定值组控制块值列表

	\return		无返回值
*/
PIS10_API void FreeSGCBValueList(SGCBValuesList* valueList);

/*!	\brief	该接口用于释放动态分配的日志控制块值列表。
	\details
	主要用于释放 IEC61850_GetLCBValues() 接口的响应数据。

	\ingroup	LCB

	\param[in,out]	lcbValuesList	日志控制块值列表

	\return		无返回值
*/
PIS10_API void FreeLcbValuesList(LCBValuesList* lcbValuesList);

/*!	\brief	该接口用于释放动态分配的 GOOSE 控制块值列表。
	\details
	主要用于释放 IEC61850_GetGoCBValues() 接口的响应数据。

	\ingroup	GooseCB

	\param[in,out]	valuesList	GOOSE 控制块值列表

	\return		无返回值
*/
PIS10_API void FreeGoCBValuesList(GoCBValuesList* valuesList);

/*!	\brief	该接口用于释放动态分配的多播采样值控制块值列表。<br>
	\ingroup	Support

	\param[in,out]	valuesList	多播采样值控制块值列表

	\return		无返回值
*/
PIS10_API void FreeSvCBValuesList(MSVCBValuesList* valuesList);
	
/*!	\brief	该接口用于释放由 StringListMalloc() 接口初始化的字符串列表。<br>
	\ingroup	Support

	\param[in,out]	ss	字符串列表

	\return		无返回值
*/
PIS10_API void FreeStringList(struct StringList* ss);

/*!	\brief	该接口用于释放采用&符号传入的StringList结构体。<br>
	\ingroup	Support

	\param[in,out]	ss	字符串列表

	\return		无返回值
*/
PIS10_API void FreeStringListElement(StringList* ss);

/*!	\brief	该接口用于初始化一个字符串列表。
	\details
	初始化后，可通过 StringListAdd()、StringListAddNew() 向字符串列表中添加元素。<br>
	使用该接口初始化的字符串列表，在使用之后需要使用 FreeStringList() 释放资源。

	\ingroup	Support

	\return		字符串列表

	<b>示例</b>
	\code
	StringList *ss = StringListMalloc();
	\endcode
*/
PIS10_API struct StringList* StringListMalloc();

/*!	\brief	该接口用于向初始化之后的字符串列表中添加字符串成员。
	\details
	调用该接口前，需要先调用 StringListMalloc() 对字符串列表进行初始化。

	\ingroup	Support

	\param[in]	ss	字符串列表
	\param[in]	str	要添加到字符串列表中的字符串

	\return		添加成功时，为字符串列表中包含的字符串数量；添加失败时，返回 -1

	<b>示例</b>
	\code
	const char* c = "CCCCC";
	struct StringList *ss = StringListMalloc();
	StringListAdd(ss, "AAAAA");
	StringListAdd(ss, "BBBBB");
	StringListAdd(ss, c);
	\endcode
*/
PIS10_API int StringListAdd(struct StringList* ss, char* str);

/*!	\brief	该接口用于向初始化之后的字符串列表中添加不重复的字符串成员。
	\details
	该接口的用法与 `StringListAdd()` 相同。<br>
	调用该接口前，需要先调用 `StringListMalloc()` 对字符串列表进行初始化。

	\ingroup	Support

	\param[in]	strlist	字符串列表
	\param[in]	str		要添加到字符串列表中的字符串

	\return		添加成功时，为字符串列表中包含的字符串数量；添加失败时，返回 -1
*/
PIS10_API int StringListAddNew(struct StringList* strlist, char* str);

/*!	\brief	该接口用于清理由 StringList
	\ingroup 	Support

	\param[in]	list	字符串列表

	\return	无返回值
*/
PIS10_API void StringListClean(StringList* list);

/*!	\brief
	\details
	该接口基于传入的 MMS 协议格式（以 "\$" 为连接符）的对象引用，<br>
	查找并传出其对应的 IEC61850 格式（以 "/" 和 "." 为连接符）的对象引用和对应的功能约束（FC）<br>
	CMS版本不涉及 MMS 的数据引用格式，该接口仅适用于 MMS 协议版本，不适用于 CMS 版本。

	\ingroup	Support

	\param[in]		mmsRef	-
	\param[in,out]	sOutRef	-
	\param[in,out]	sOutFC	-

	\return		无返回值
*/
void ReferenceMMSToIEC61850(char* mmsRef, char* sOutRef, char* sOutFC);

/*!	\brief	读服务器目录。
	\details
	对应的 ACSI 服务接口为：\"GetServerDirectory\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	Support

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetServerDirectory 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetServerDirectory 的响应数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\see	FreeGetServerDirectory_Response()
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetServerDirectory(IEC61850 client, unsigned int serverIndex, GetServerDirectory_Request* request, GetServerDirectory_Response* response);
	
/*!	\brief	读逻辑设备目录。
	\details
	对应的 ACSI 服务接口为：\"GetLogicalDeviceDirectory\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	ModelData

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetLogicalDeviceDirectory 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetLogicalDeviceDirectory 的响应数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\see	FreeGetLogicalDeviceDirectory_Response()
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetLogicalDeviceDirectory(IEC61850 client, unsigned int serverIndex, GetLogicalDeviceDirectory_Request* request, GetLogicalDeviceDirectory_Response* response);
	
/*!	\brief	读逻辑节点目录。
	\details
	对应的 ACSI 服务接口为：\"GetLogicalNodeDirectory\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	ModelData

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetLogicalNodeDirectory 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetLogicalNodeDirectory 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	\see	FreeGetLogicalNodeDirectory_Response()
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetLogicalNodeDirectory(IEC61850 client, unsigned int serverIndex, GetLogicalNodeDirectory_Request* request, GetLogicalNodeDirectory_Response* response);
	
/*!	\brief	读所有数据值。 
	\details
	对应的 ACSI 服务接口为：\"GetAllDataValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	ModelData

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetAllDataValues 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetAllDataValues 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetAllDataValues(IEC61850 client, unsigned int serverIndex, GetAllData_Request* request, GetAllDataValues_Response* response);
	
/*!	\brief	读所有数据定义。
	\details
	对应的 ACSI 服务接口为：\"GetAllDataDefinition\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	ModelData

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetAllDataDefinition 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetAllDataDefinition 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetAllDataDefinition(IEC61850 client, unsigned int serverIndex, GetAllData_Request* request, GetAllDataDefinition_Response* response);
	
/*!	\brief	读所有控制块的值。
	\details
	对应的 ACSI 服务接口为：\"GetAllCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	ModelData

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetAllCBValues 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetAllCBValues 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetAllCBValues(IEC61850 client, unsigned int serverIndex, GetAllCBValues_Request* request, GetAllCBValues_Response* response);
	
/*!	\brief	读数据值。
	\details
	对应的 ACSI 服务接口为：\"GetDataValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	ModelData

	\param[in]		client 		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetDataValues 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetDataValues 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDataValues(IEC61850 client, unsigned int serverIndex, GetDataValues_Request* request, GetDataValues_Response* response);
	
/*!	\brief	写数据值。
	\details
	对应的 ACSI 服务接口为：\"SetDataValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	ModelData

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 SetDataValues 的请求数据
	\param[in,out]	response	ACSI 服务接口 SetDataValues 的响应数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetDataValues(IEC61850 client, unsigned int serverIndex, SetDataValues_Request* request, SetDataValues_Response* response);
	
/*!	\brief	读数据目录。
	\details
	对应的 ACSI 服务接口为：\"GetDataDirectory\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	ModelData

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetDataDirectory 的请求
	\param[in,out]	response	ACSI 服务接口 GetDataDirectory 的应答

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDataDirectory(IEC61850 client, unsigned int serverIndex, GetDataDirectory_Request* request, GetDataDirectory_Response* response);
	
/*!	\brief	读数据定义。
	\details
	对应的 ACSI 服务接口为：\"GetDataDefinition\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	ModelData

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetDataDefinition 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetDataDefinition 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDataDefinition(IEC61850 client, unsigned int serverIndex, GetDataDefinition_Request* request, GetDataDefinition_Response* response);
	
/*!	\brief	读数据集目录。
	\details
	对应的 ACSI 服务接口为：\"GetDataSetDirectory\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	DataSet

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetDataSetDirectory 的请求
	\param[in,out]	response	ACSI 服务接口 GetDataSetDirectory 的应答

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDataSetDirectory(IEC61850 client, unsigned int serverIndex, GetDataSetDirectory_Request* request, GetDataSetDirectory_Response* response);
	
/*!	\brief	读数据集值。
	\details
	对应的 ACSI 服务接口为：\"GetDataSetValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	DataSet

	\param[in]		client		IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetDataSetValues 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetDataSetValues 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDataSetValues(IEC61850 client, unsigned int serverIndex, GetDataSetValues_Request* request, GetDataSetValues_Response* response);
	
/*!	\brief	写数据集值。
	\details
	对应的 ACSI 服务接口为：\"SetDataSetValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup 	DataSet

	\param[in]		client		IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 SetDataSetValues 的请求
	\param[in,out]	response	ACSI 服务接口 SetDataSetValues 的应答

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetDataSetValues(IEC61850 client, unsigned int serverIndex, SetDataSetValues_Request* request, SetDataSetValues_Response* response);
	
/*!	\brief	客户端向服务器发起创建数据集的请求
	\details
	对应的 ACSI 服务接口为：\"CreateDataSet\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	DataSet

	\param[in]		client			IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]		serverIndex		服务端的索引号
	\param[in]		request			ACSI 服务接口 CreateDataSet 的请求
	\param[in,out]	serviceError	ACSI 服务接口 CreateDataSet 的应答

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_ErrorCode result = S_OK;
	IEC61850 iec61850 = GetMyServerClient();
	unsigned int serverIndex = 0;
	CreateDataSet_Request request = { 0 };
	eServiceError serviceError;
	FCDA fcdaList[2] = { 0 };
	request.datasetReference = "ServerIEDExample/LLN0.PersistentDS";
	request.fcdaList = fcdaList;
	request.numOfFcda = 2;

	strcpy(fcdaList[0].DARef, "ServerIEDExample/LLN0.Beh.stVal");
	strcpy(fcdaList[1].DARef, "ServerIEDExample/LPHD0.Beh.stVal");
	strcpy(fcdaList[0].FC, "ST");
	strcpy(fcdaList[1].FC, "ST");

	result = IEC61850_CreateDataSet(iec61850, serverIndex, &request, &serviceError);

	return result;

	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_CreateDataSet(IEC61850 client, unsigned int serverIndex, CreateDataSet_Request* request, eServiceError *serviceError);
	
/*!	\brief	客户端向服务器发起删除数据集的请求
	\details
	对应的 ACSI 服务接口为：\"DeleteDataSet\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup 	DataSet

	\param[in]		client				IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]		serverIndex			服务端的索引号
	\param[in]		datasetReference	数据集引用
	\param[in,out] 	serviceError		服务级别的错误代码

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_ErrorCode result = S_OK;
	IEC61850 iec61850 = GetMyServerClient();
	unsigned int serverIndex = 0;
	eServiceError serviceError = SERVICE_ERROR_NO_ERROR;
	char* datasetReference = "ServerIEDExample/LLN0.PersistentDS";

	result = IEC61850_DeleteDataSet(iec61850, serverIndex, datasetReference, &serviceError);
	return result;
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_DeleteDataSet(IEC61850 client, unsigned int serverIndex, char* datasetReference, eServiceError* serviceError);
	
/*!	\brief	选择激活定值组。 <br>
	\details
	对应的 ACSI 服务接口为：\"SelectActiveSG\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	SGCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		SelectActiveSG 请求对象
	\param[in,out]	response	SelectActiveSG 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SelectActiveSG(IEC61850 client, unsigned int serverIndex, SelectActiveSG_Request* request, SelectActiveSG_Response* response);
	
/*!	\brief	选择编辑定值组。
	\details
	对应的 ACSI 服务接口为：\"SelectEditSG\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	SGCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		SelectEditSG 请求对象
	\param[in,out]	response	SelectEditSG 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SelectEditSG(IEC61850 client, unsigned int serverIndex, SelectEditSG_Request* request, SelectEditSG_Response* response);
	
/*!	\brief	设置编辑定值组值。
	\details
	对应的 ACSI 服务接口为：\"SetEditSGValue\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。<br>
	该接口仅应该在编辑定值组有效（EditSG ≠ 0）时调用。

	\ingroup	SGCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		SetEditSGValue 请求对象
	\param[in,out]	response	SetEditSGValue 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetEditSGValue(IEC61850 client, unsigned int serverIndex, SetEditSGValue_Request* request, SetEditSGValue_Response* response);
	
/*!	\brief	确定编辑定值组。
	\details
	对应的 ACSI 服务接口为：\"ConfirmEditSGValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。<br>
	该接口仅应该在编辑定值组有效（EditSG ≠ 0）时调用。

	\ingroup	SGCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ConfirmEditSGValues 请求对象
	\param[in,out]	response	ConfirmEditSGValues 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_ConfirmEditSGValues(IEC61850 client, unsigned int serverIndex, ConfirmEditSGValues_Request* request, ConfirmEditSGValues_Response* response);
	
/*!	\brief	读定值组值。
	\details
	对应的 ACSI 服务接口为：\"GetEditSGValue\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	SGCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		GetEditSGValue 请求对象
	\param[in,out]	response		GetEditSGValue 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetEditSGValue(IEC61850 client, unsigned int serverIndex, GetEditSGValue_Request* request, GetEditSGValue_Response* response);
	
/*!	\brief	读定值组控制块值。
	\details
	对应的 ACSI 服务接口为：\"GetSGCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	SGCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		GetSGCBValues 请求对象
	\param[in,out]	response	GetSGCBValues 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetSGCBValues(IEC61850 client, unsigned int serverIndex, GetSGCBValues_Request* request, GetSGCBValues_Response* response);
	
/*!	\brief	读缓存报告控制块值。
	\details
	对应的 ACSI 服务接口为：\"GetBRCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	BRCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		GetBRCBValues 请求对象
	\param[in,out]	response	GetBRCBValues 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetBRCBValues(IEC61850 client, unsigned int serverIndex, GetBRCBValues_Request* request, GetBRCBValues_Response* response);
	
/*!	\brief	设置缓存报告控制块值。
	\details
	对应的 ACSI 服务接口为：\"SetBRCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	BRCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		SetBRCBValues 请求对象
	\param[in,out]	response	SetBRCBValues 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetBRCBValues(IEC61850 client, unsigned int serverIndex, SetBRCBValues_Request* request, SetBRCBValues_Response* response);
	
/*!	\brief	读非缓存报告控制块值。
	\details
	对应的 ACSI 服务接口为：\"GetURCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	URCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		GetURCBValues 请求对象
	\param[in,out]	response	GetURCBValues 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetURCBValues(IEC61850 client, unsigned int serverIndex, GetURCBValues_Request* request, GetURCBValues_Response* response);
	
/*!	\brief	读日志控制块值。
	\details
	对应的 ACSI 服务接口为：\"GetLCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	URCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		SetURCBValues 请求对象
	\param[in,out]	response	SetURCBValues 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetURCBValues(IEC61850 client, unsigned int serverIndex, SetURCBValues_Request* request, SetURCBValues_Response* response);
	
/*!	\brief	读日志控制块值。
	\details
	对应的 ACSI 服务接口为：\"GetLCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	LCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		GetLCBValues 请求对象
	\param[in,out]	response	GetLCBValues 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetLCBValues(IEC61850 client, unsigned int serverIndex, GetLCBValues_Request* request, GetLCBValues_Response* response);
	
/*!	\brief	设置日志控制块值。
	\details
	对应的 ACSI 服务接口为：\"SetLCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	LCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		SetLCBValues 请求对象
	\param[in,out]	response	SetLCBValues 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetLCBValues(IEC61850 client, unsigned int serverIndex, SetLCBValues_Request* request, SetLCBValues_Response* response);
	
/*!	\brief	按时间查询日志。
	\details
	对应的 ACSI 服务接口为：\"QueryLogByTime\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	LCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		QueryLogByTime 请求对象
	\param[in,out]	response	QueryLogByTime 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_QueryLogByTime(IEC61850 client, unsigned int serverIndex, QueryLogByTime_Request* request, QueryLogByTime_Response* response);
	
/*!	\brief	查询指定条目之后的日志。
	\details
	对应的 ACSI 服务接口为：\"QueryLogAfter\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	LCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		 QueryLogAfter 请求对象
	\param[in,out]	response	 QueryLogAfter 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_QueryLogAfter(IEC61850 client, unsigned int serverIndex, QueryLogAfter_Request* request, QueryLogAfter_Response* response);
	
/*!	\brief	读日志状态值。
	\details
	对应的 ACSI 服务接口为：\"GetLogStatusValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	LCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		 GetLogStatusValues 请求对象
	\param[in,out]	response	 GetLogStatusValues 应答对象

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetLogStatusValues(IEC61850 client, unsigned int serverIndex, GetLogStatusValues_Request* request, GetLogStatusValues_Response* response);
	
/*!	\brief	读 GOOSE 控制块值。
	\details
	对应的 ACSI 服务接口为：\"GetGoCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	GooseCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetGoCBValues 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetGoCBValues 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetGoCBValues(IEC61850 client, unsigned int serverIndex, GetGoCBValues_Request* request, GetGoCBValues_Response* response);
	
/*!	\brief	设置 GOOSE 控制块值。
	\details
	对应的 ACSI 服务接口为：\"SetGoCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	GooseCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 SetGoCBValues 的请求数据
	\param[in,out]	response	ACSI 服务接口 SetGoCBValues 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetGoCBValues(IEC61850 client, unsigned int serverIndex, SetGoCBValues_Request* request, SetGoCBValues_Response* response);
	
/*!	\brief	读多播采样值控制块值。
	\details
	对应的 ACSI 服务接口为：\"GetMSVCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	MSVCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetMSVCBValues 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetMSVCBValues 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetMSVCBValues(IEC61850 client, unsigned int serverIndex, GetMSVCBValues_Request* request, GetMSVCBValues_Response* response);
	
/*!	\brief	设置多播采样值控制块值。
	\details
	对应的 ACSI 服务接口为：\"SetMSVCBValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	MSVCB

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 SetMSVCBValues 的请求数据
	\param[in,out]	response	ACSI 服务接口 SetMSVCBValues 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetMSVCBValues(IEC61850 client, unsigned int serverIndex, SetMSVCBValues_Request* request, SetMSVCBValues_Response* response);
	
/*!	\brief	读文件。
	\details
	对应的 ACSI 服务接口为：\"GetFile\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。<br>
	该接口不会创建文件名路径中缺失的目录层级。路径不存在时，操作将会失败。

	\ingroup	File

	\param[in]	client			IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	serverIndex		服务端的索引号
	\param[in]	remoteFileName	ACSI 服务接口 GetFile 的请求数据。
								要读取（下载）的服务端的文件名（fileName）。
								文件名应使用完整路径，以 "/" 起始。
	\param[in]	localFileName	文件读取（下载）到本地后，在本地保存的文件名。

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetFile(IEC61850 client, unsigned int serverIndex, const char* remoteFileName, const char* localFileName);

/*!	\brief	写文件。
	\details
	对应的 ACSI 服务接口为：\"SetFile\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。<br>
	该接口不会创建文件名路径中缺失的目录层级。路径不存在时，操作将会失败。

	\ingroup	File

	\param[in]	client			IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	serverIndex		服务端的索引号
	\param[in]	localFileName	ACSI 服务接口 SetFile 的请求数据。<br>
								本地待写（上传）到服务端的文件的文件名（fileName）。<br>
								作为写文件的数据来源。
	\param[in]	remoteFileName	ACSI 服务接口 SetFile 的请求数据。<br>
								文件写到服务端后，在服务端保存的文件名（fileName）。<br>
								文件名应使用完整路径，以 "/" 起始。

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetFile(IEC61850 client, unsigned int serverIndex, const char* localFileName, const char* remoteFileName);
	
/*!	\brief	删除文件。 对应的 ACSI 服务接口为：\"DeleteFile\"。
	\details
	该接口为客户端使用的接口，服务端禁止调用。<br>
	该接口可以删除文件目录，但仅有空的目录才可以被删除，删除非空的目录会失败，必须先删除该目录中的所有文件，才能删除该目录。

	\ingroup	File

	\param[in]	client			IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	serverIndex		服务端的索引号
	\param[in]	fileName		ACSI 服务接口 DeleteFile 的文件名
	\param[in]	serviceError	ACSI 服务接口 DeleteFile 的应答返回码

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_DeleteFile(IEC61850 client, unsigned int serverIndex, char* fileName, eServiceError* serviceError);
	
/*!	\brief	读文件属性值。
	\details
	对应的 ACSI 服务接口为：\"GetFileAttributeValues\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	File

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetFileAttributeValues 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetFileAttributeValues 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetFileAttributeValues(IEC61850 client, unsigned int serverIndex, GetFileAttributeValues_Request* request, GetFileAttributeValues_Response* response);
	
/*!	\brief	读文件目录。
	\details
	对应的 ACSI 服务接口为：\"GetFileDirectory\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	File

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetFileDirectory 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetFileDirectory 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetFileDirectory(IEC61850 client, unsigned int serverIndex, GetFileDirectory_Request* request, GetFileDirectory_Response* response);
	
/*!	\brief	该接口用于获取服务端报告控制块数据。

	\param[in]		server				IEC61850 对象。<br>对象角色必须是服务端 `IEC61850_SERVER`
	\param[in]		rcbReference		报告控制块ref引用
	\param[in]		reportInstanceIndex	报告控制块实例索引
	\param[in,out]  rcbValues  			服务端报告控制块数据

	\return		错误码。<br>成功则返回  #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetLocalServerRCBValues(IEC61850 server, char* rcbReference, unsigned int reportInstanceIndex, RCBValues* rcbValues);
	
/*!	\brief	该接口用于获取服务端控制数据。

	\param[in]		server			IEC61850 对象。<br>对象角色必须是服务端 `IEC61850_SERVER`
	\param[in]		ctlReference	控制ref引用
	\param[in,out]  ctlInfo			服务端控制数据

	\return		错误码。<br>成功则返回  #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetLocalServerControlInfo(IEC61850 server, char* ctlReference, ControlInfo* ctlInfo);
	
/*!	\brief	该接口用于给服务端创建远程过程调用（RPC）接口（interface）。
	\details
	创建好的 RPC 接口，需要通过 RPC_AddMethodToInterface() <br>
	接口为其添加方法（method）。该接口为服务端使用的接口，客户端禁止调用。

	\ingroup	RPC

	\param[in]	server				IEC61850 对象。对象角色必须是服务端 IEC61850_SERVER
	\param[in]	interfaceNameList	要创建的 RPC 接口的名称列表

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API int RPC_CreateInterface(IEC61850 server, struct StringList* interfaceNameList);
	
/*!	\brief	该接口用于给远程过程调用接口添加方法（method）。
	\details
	需要在 RPC_CreateInterface() 创建好 RPC 接口之后调用。<br>
	该接口为服务端使用的接口，客户端禁止调用。

	\ingroup	RPC

	\param[in]	server			EC61850 对象。对象角色必须是服务端 IEC61850_SERVER
	\param[in]	interfaceIndex	RPC 接口的索引号。<br>
								索引号从 0 开始，依次递增 1，<br>
								按序依次对应 RPC_CreateInterface() 在 interfaceNameList 参数中指定的接口。
	\param[in]	methodName		方法名称
	\param[in]	version			方法的版本号
	\param[in]	timeout			方法的超时时间
	\param[in]	request			方法的请求数据定义
	\param[in]	response		方法的响应数据定义
	\param[in]	pvFunc			方法实体函数的函数地址。
								方法函数的原型，参照 CMS_RpcCallFunc 。

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API int RPC_AddMethodToInterface(IEC61850 server, U32 interfaceIndex, char* methodName, U32 version, U32 timeout, CMSDataDefinition* request, CMSDataDefinition* response, void* pvFunc);
	
/*!	\brief	读远程过程调用接口目录。
	\details
	对应的 ACSI 服务接口为：\"GetRpcInterfaceDirectory\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	RPC

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetRpcInterfaceDirectory 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetRpcInterfaceDirectory 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode CMS_GetRpcInterfaceDirectory(IEC61850 client, unsigned int serverIndex, GetRpcInterfaceDirectory_Request* request, GetRpcInterfaceDirectory_Response* response);
	
/*!	\brief	读远程过程调用方法目录。
	\details
	对应的 ACSI 服务接口为：\"GetRpcMethodDirectory\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	RPC

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetRpcMethodDirectory 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetRpcMethodDirectory 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode CMS_GetRpcMethodDirectory(IEC61850 client, unsigned int serverIndex, GetRpcMethodDirectory_Request* request, GetRpcMethodDirectory_Response* response);
	
/*!	\brief	读远程过程调用接口定义。
	\details
	对应的 ACSI 服务接口为：\"GetRpcInterfaceDefinition\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup	RPC

	\param[in]		client		IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex	服务端的索引号
	\param[in]		request		ACSI 服务接口 GetRpcInterfaceDefinition 的请求数据
	\param[in,out]	response	ACSI 服务接口 GetRpcInterfaceDefinition 的应答数据

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode CMS_GetRpcInterfaceDefinition(IEC61850 client, unsigned int serverIndex, GetRpcInterfaceDefinition_Request* request, GetRpcInterfaceDefinition_Response* response);
	
/*!	\brief	读远程过程调用方法定义。
	\details
	对应的 ACSI 服务接口为：\"GetRpcMethodDefinition\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup 	RPC
	\param[in]		client			IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]		serverIndex		服务端的索引号
	\param[in]		request			GetRpcInterfaceDefinition请求
	\param[out]		response		GetRpcInterfaceDefinition应答
	\return		无返回值
*/
PIS10_API IEC61850_ErrorCode CMS_GetRpcMethodDefinition(IEC61850 client, unsigned int serverIndex, GetRpcMethodDefinition_Request* request, GetRpcMethodDefinition_Response* response);
	
/*!	\brief	远程过程调用。
	\details
	对应的 ACSI 服务接口为：\"RpcCall\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。

	\ingroup 	RPC

	\param[in]	client			IEC61850 对象。对象角色必须是客户端 IEC61850_CLIENT
	\param[in]	serverIndex		服务端的索引号
	\param[in]	request			RpcCall请求
	\param[out]	response		RpcCall应答

	\return		无返回值
*/
PIS10_API IEC61850_ErrorCode CMS_RpcCall(IEC61850 client, unsigned int serverIndex, RpcCall_Request* request, RpcCall_Response* response);
	
/*!	\brief	该接口用于释放动态分配的远程过程调用数据。
	\ingroup	RPC

	\param[in,out]	rpcData	远程过程调用数据

	\return		无返回值
*/
PIS10_API void FreeRpcData(RpcData* rpcData);

/*!	\brief	该接口用于释放动态分配的远程过程调用数据定义。
	\ingroup	RPC

	\param[in,out]	dataDefinition	远程过程调用数据定义

	\return		无返回值
*/
PIS10_API void FreeRpcDataDefinition(CMSDataDefinition* dataDefinition);

/*!	\brief	该接口用于释放动态分配的、读远程过程调用方法定义的响应结果列表。
	\details
	主要用于释放 `CMS_GetRpcMethodDefinition()` 接口的响应数据。

	\ingroup	RPC

	\param[in,out]	methodList	读远程过程调用接口的方法定义列表

	\return		无返回值
*/
PIS10_API void FreeRpcMethodDefinitionResultList(GetRpcMethodDefinitionResultList* methodList);

/*!	\brief	该接口用于释放动态分配的、读远程过程调用方法定义的响应结果列表。
	\details
	主要用于释放 CMS_GetRpcInterfaceDefinition() 接口的响应数据。

	\ingroup	RPC

	\param[in,out]	methodList	读远程过程调用接口的方法定义列表

	\return		无返回值
*/
PIS10_API void FreeRpcMethodList(MethodList* methodList);

/*!	\brief	该接口用于释放 IEC61850_GetServerDirectory() 接口的响应数据。
	\ingroup	ModelData

	\param[in,out]	response	IEC61850_GetServerDirectory() 的响应数据

	\return		无返回值

	\see	IEC61850_GetServerDirectory()
*/
PIS10_API void FreeGetServerDirectory_Response(GetServerDirectory_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetLogicalDeviceDirectory() 接口的响应数据。
	\ingroup	ModelData

	\param[in,out]	response	IEC61850_GetLogicalDeviceDirectory() 的响应数据

	\return		无返回值

	\see	IEC61850_GetLogicalDeviceDirectory()
*/
PIS10_API void FreeGetLogicalDeviceDirectory_Response(GetLogicalDeviceDirectory_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetLogicalNodeDirectory() 接口的响应数据。
	\ingroup	ModelData

	\param[in,out]	response	IEC61850_GetLogicalNodeDirectory() 的响应数据

	\return		无返回值

	\see	IEC61850_GetLogicalNodeDirectory()
*/
PIS10_API void FreeGetLogicalNodeDirectory_Response(GetLogicalNodeDirectory_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetDataValues() 接口的响应数据。
	\ingroup	ModelData

	\param[in,out]	response	IEC61850_GetDataValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetDataValues_Response(GetDataValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetAllDataValues() 接口的响应数据。
	\ingroup	ModelData

	\param[in,out]	response	IEC61850_GetAllDataValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetAllDataValues_Response(GetAllDataValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_SetDataValues() 接口的响应数据。
	\ingroup	ModelData

	\param[in,out]	response	IEC61850_SetDataValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeSetDataValues_Response(SetDataValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetDataDirectory() 接口的响应数据。
	\ingroup	ModelData

	\param[in,out]	response	IEC61850_GetDataDirectory() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetDataDirectory_Response(GetDataDirectory_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetDataDefinition() 接口的响应数据。
	\ingroup	ModelData

	\param[in,out]	response	IEC61850_GetDataDefinition() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetDataDefinition_Response(GetDataDefinition_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetDataSetDirectory() 接口的响应数据。
	\ingroup	DataSet

	\param[in,out]	response	IEC61850_GetDataSetDirectory() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetDataSetDirectory_Response(GetDataSetDirectory_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetDataSetValues() 接口的响应数据。
	\ingroup	DataSet

	\param[in,out]	response	IEC61850_GetDataSetValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetDataSetValues_Response(GetDataSetValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_SetDataSetValues() 接口的响应数据。
	\ingroup	DataSet

	\param[in,out]	response	IEC61850_SetDataSetValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeSetDataSetValues_Response(SetDataSetValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_SetEditSGValue() 接口的响应数据。
	\ingroup	SGCB

	\param[in,out]	response	IEC61850_SetEditSGValue() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeSetEditSGValue_Response(SetEditSGValue_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetEditSGValue() 接口的响应数据。
	\ingroup	SGCB

	\param[in,out]	response	IEC61850_GetEditSGValue() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetEditSGValue_Response(GetEditSGValue_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetSGCBValues() 接口的响应数据。
	\ingroup	SGCB

	\param[in,out]	response	IEC61850_GetSGCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetSGCBValues_Response(GetSGCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetBRCBValues() 接口的响应数据。
	\ingroup	BRCB

	\param[in,out]	response	IEC61850_GetBRCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetBRCBValues_Response(GetBRCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_SetBRCBValues() 接口的响应数据。
	\ingroup	BRCB

	\param[in,out]	response	IEC61850_SetBRCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeSetBRCBValues_Response(SetBRCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetURCBValues() 接口的响应数据。
	\ingroup	URCB

	\param[in,out]	response	IEC61850_GetURCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetURCBValues_Response(GetURCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_SetURCBValues() 接口的响应数据。
	\ingroup	URCB

	\param[in,out]	response	IEC61850_SetURCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeSetURCBValues_Response(SetURCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetLCBValues() 接口的响应数据。
	\ingroup	LCB

	\param[in,out]	response	IEC61850_GetLCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetLCBValues_Response(GetLCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_SetLCBValues() 接口的响应数据。
	\ingroup	LCB

	\param[in,out]	response	IEC61850_SetLCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeSetLCBValues_Response(SetLCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_QueryLogByTime() 接口的响应数据。
	\ingroup	LCB

	\param[in,out]	response	IEC61850_QueryLogByTime() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeQueryLogByTime_Response(QueryLogByTime_Response* response);

/*!	\brief	该接口用于释放 IEC61850_QueryLogAfter() 接口的响应数据。
	\ingroup	LCB

	\param[in,out]	response	IEC61850_QueryLogAfter() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeQueryLogAfter_Response(QueryLogAfter_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetLogStatusValues() 接口的响应数据。
	\ingroup	LCB

	\param[in,out]	response	IEC61850_GetLogStatusValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetLogStatusValues_Response(GetLogStatusValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetGoCBValues() 接口的响应数据。
	\ingroup	GooseCB

	\param[in,out]	response	IEC61850_GetGoCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetGoCBValues_Response(GetGoCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_SetGoCBValues() 接口的响应数据。
	\ingroup	GooseCB

	\param[in,out]	response	IEC61850_SetGoCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeSetGoCBValues_Response(SetGoCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetMSVCBValues() 接口的响应数据。
	\ingroup	MSVCB

	\param[in,out]	response	IEC61850_GetMSVCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetMSVCBValues_Response(GetMSVCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_SetMSVCBValues() 接口的响应数据。
	\ingroup	MSVCB

	\param[in,out]	response	IEC61850_SetMSVCBValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeSetMSVCBValues_Response(SetMSVCBValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetFile() 接口的响应数据。
	\ingroup	File

	\param[in,out]	response	IEC61850_GetFile() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetFile_Response(GetFile_Response* response);

/*!	\brief	该接口用于释放 IEC61850_SetFile() 接口的响应数据。
	\ingroup	File

	\param[in,out]	response	IEC61850_SetFile() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeSetFile_Response(SetFile_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetFileAttributeValues() 接口的响应数据。
	\ingroup	File

	\param[in,out]	response	IEC61850_GetFileAttributeValues() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetFileAttributeValues_Response(GetFileAttributeValues_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetFileDirectory() 接口的响应数据。
	\ingroup	File

	\param[in,out]	response	IEC61850_GetFileDirectory() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetFileDirectory_Response(GetFileDirectory_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetRpcInterfaceDirectory() 接口的响应数据。
	\ingroup	RPC

	\param[in,out]	response	IEC61850_GetRpcInterfaceDirectory() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetRpcInterfaceDirectory_Response(GetRpcInterfaceDirectory_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetRpcMethodDirectory() 接口的响应数据。
	\ingroup	RPC

	\param[in,out]	response	IEC61850_GetRpcMethodDirectory() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetRpcMethodDirectory_Response(GetRpcMethodDirectory_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetRpcInterfaceDefinition() 接口的响应数据。
	\ingroup	RPC

	\param[in,out]	response	IEC61850_GetRpcInterfaceDefinition() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetRpcInterfaceDefinition_Response(GetRpcInterfaceDefinition_Response* response);

/*!	\brief	该接口用于释放 IEC61850_GetRpcMethodDefinition() 接口的响应数据。
	\ingroup	RPC

	\param[in,out]	response	IEC61850_GetRpcMethodDefinition() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeGetRpcMethodDefinition_Response(GetRpcMethodDefinition_Response* response);

/*!	\brief	该接口用于释放 IEC61850_RpcCall() 接口的响应数据。
	\ingroup	RPC

	\param[in,out]	response	IEC61850_RpcCall() 的响应数据

	\return		无返回值
*/
PIS10_API void FreeRpcCall_Response(RpcCall_Response* response);


PIS10_API DAHANDLE IEC61850_GetDataAttributeHandle(IEC61850 server, char* reference);

/*!	\brief	获取数据集句柄
	\ingroup	DataSet

	\warning	<b>该接口暂不可用</b>

	\param[in]	server		IEC61850 对象。<br>对象角色必须是服务端 `IEC61850_SERVER`
	\param[in]	reference	数据集引用

	\return		DATASETHANDLE 数据集句柄

	<b>示例</b>
	\code
	IEC61850 iec61850 = GetMyServerClient();
	char* dsReference = "ServerIEDExample/MMXU0.MMXUDataSet";
	DATASETHANDLE dsHandle = IEC61850_GetDataSetHandle(iec61850, dsReference);
	\endcode
*/
PIS10_API DATASETHANDLE IEC61850_GetDataSetHandle(IEC61850 server, char* reference);

PIS10_API Boolean CheckHandle(void* handle);

/*!	\brief	使用数据集句柄获取数据集关联数据的基本类型数据列表
	\ingroup	DataSet

	\warning	<b>该接口暂不可用</b>
	
	\param[in]	server		IEC61850 对象。<br>对象角色必须是服务端 `IEC61850_SERVER`
	\param[in]	dsHandle	数据集句柄
	\param[out]	dsDataList	返回的数据集所关联数据的基本数据类型列表

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_ErrorCode result = S_OK;
	IEC61850 iec61850 = GetMyServerClient();
	char* dsReference = "ServerIEDExample/MMXU0.MMXUDataSet";
	IEC61850_DataSetDataList dsDataList = { 0 };
	DATASETHANDLE dsHandle = IEC61850_GetDataSetHandle(iec61850, dsReference);
	if (CheckHandle(dsHandle)) {
		result = IEC61850_GetDataSetDataList(iec61850, dsHandle, &dsDataList);
		if (result == S_OK) {
			if (dsDataList.datasetDatas) {
				for (unsigned int dataIndex = 0; dataIndex < dsDataList.numOfDatas; dataIndex++) {
					printf("NO.%u:\n", dataIndex);
					printf("  reference:%s\n", dsDataList.datasetDatas[dataIndex].dataReference);
					printf("  Data index in dataset:%d\n", dsDataList.datasetDatas[dataIndex].dataIndexInDataset);
					printf("  Data type:%d\n", dsDataList.datasetDatas[dataIndex].data.type);
					printf("  Data size:%d\n", dsDataList.datasetDatas[dataIndex].data.bitLength);
				}
			}
		}
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDataSetDataList(IEC61850 server, DATASETHANDLE dsHandle, IEC61850_DataSetDataList* dsDataList);

/*!	\brief	使用数据集句柄批量更新数据集数据（只更新数据不触发报告、goose等）
	\ingroup	DataSet

	\warning	<b>该接口暂不可用</b>

	\param[in]	server		IEC61850 对象。<br>对象角色必须是服务端 `IEC61850_SERVER`
	\param[in]	dsHandle	数据集句柄
	\param[out]	dataList	返回的数据集所关联数据的基本数据类型列表

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_ErrorCode result = S_OK;
	IEC61850 iec61850 = GetMyServerClient();
	char* dsReference = "ServerIEDExample/MMXU0.MMXUDataSet";
	IEC61850_DataSetDataList dsDataList = { 0 };
	DATASETHANDLE dsHandle = IEC61850_GetDataSetHandle(iec61850, dsReference);

	if (CheckHandle(dsHandle)) {
		result = IEC61850_GetDataSetDataList(iec61850, dsHandle, &dsDataList);
		if (result == S_OK) {
			S32 Magi1 = 1;
			S32 Magi2 = 2;
			S32 Magi3 = 3;
			IEC61850_QualityFlag Quality1 = IEC61850_QUALITY_OVERFLOW;
			IEC61850_QualityFlag Quality2 = IEC61850_QUALITY_OUTOFRANGE;
			IEC61850_QualityFlag Quality3 = IEC61850_QUALITY_GOOD;
			IEC61850_TimeStamp Time1 = { 0 };
			IEC61850_TimeStamp Time2 = { 0 };
			IEC61850_TimeStamp Time3 = { 0 };
			if (dsDataList.datasetDatas) {
				dsDataList.datasetDatas[0].data.pvData = &Magi1;
				dsDataList.datasetDatas[1].data.pvData = &Quality1;
				dsDataList.datasetDatas[2].data.pvData = &Time1;
				dsDataList.datasetDatas[3].data.pvData = &Magi2;
				dsDataList.datasetDatas[4].data.pvData = &Quality2;
				dsDataList.datasetDatas[5].data.pvData = &Time2;
				dsDataList.datasetDatas[6].data.pvData = &Magi3;
				dsDataList.datasetDatas[7].data.pvData = &Quality3;
				dsDataList.datasetDatas[8].data.pvData = &Time3;

				result = IEC61850_UpdateDataSetDatas(iec61850, dsHandle, &dsDataList);
			}
		}
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_UpdateDataSetDatas(IEC61850 server, DATASETHANDLE dsHandle, IEC61850_DataSetDataList* dataList);

/*!	\brief	该接口获取日志状态

	\param[in]		logCbHandle	日志控制块句柄
	\param[in,out]	logStatus	日志状态

	\return		错误码。<br>成功则返回  #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetLocalLogStatus(CBHANDLE logCbHandle, IEC61850_LogStatus* logStatus);

/*!	\brief	获取控制块句柄信息。
	\details
	该接口用于获取控制块的句柄。<br>
	获取的控制块句柄，用于 IEC61850_GetControlBlockDataList 和 IEC61850_BatchUpdateControlBlockDatas 接口的使用。<br>
	该接口为服务端使用的接口，客户端禁止调用。

	\ingroup	ControlBlock

	\param[in]	server			IEC61850 对象。<br>对象角色必须是服务端 `IEC61850_SERVER`
	\param[in]	cbReference		控制块的引用
	\param[out]	cbHandleInfo	控制块句柄信息，即是入参也是出参。需要定义零值的 #IEC61850_CBHandleInfo 结构体数据作为出入参传参。

	\return		错误码。<br>成功则返回  #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
		IEC61850_ErrorCode result = S_OK;
		IEC61850 server = GetMyServerClient();
		char* cbReference = "ServerIEDExample/CSWI0.BufferedCB";
		IEC61850_CBHandleInfo cbHandleInfo ={ 0 };

		cbHandleInfo.controlBlockType = CONTROLBLOCK_REPORT;
		cbid.index = 1;

		result = IEC61850_GetControlBlockHandle(server, cbReference, &cbHandleInfo);

	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetControlBlockHandle(IEC61850 server, char* cbReference, IEC61850_CBHandleInfo* cbHandleInfo);

/*!	\brief	基于控制块句柄获取控制块关联数据集的基本类型数据列表
	\ingroup	ControlBlock

	\param[in]	server					IEC61850 对象。<br>对象角色必须是服务端 `IEC61850_SERVER`
	\param[in]	cbHandleInfo			控制块句柄
	\param[out]	controlBlockDataList	控制块关联数据集的基本类型数据列表

	\return		错误码。<br>成功则返回  #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_ErrorCode result = S_OK;
	IEC61850 iec61850 = GetMyServerClient();
	IEC61850_ControlBlockDataList controlBlockDataList = { 0 };
	IEC61850_CBHandleInfo cbHandleInfo = { 0 };
	char* cbReference = "ServerIEDExample/MMXU0.Measurement";

	cbHandleInfo.controlBlockType = CONTROLBLOCK_REPORT;
	cbHandleInfo.index = 1;
	result = IEC61850_GetControlBlockHandle(iec61850, cbReference, &cbHandleInfo);
	if (result == S_OK) {
		result = IEC61850_GetControlBlockDataList(iec61850, &cbHandleInfo, &controlBlockDataList);
		if (controlBlockDataList.datasetDatas) {
			for (unsigned int dataIndex = 0; dataIndex < controlBlockDataList.numOfDatas; dataIndex++) {
				printf("NO.%u:\n", dataIndex);
				printf("  reference:%s\n", controlBlockDataList.datasetDatas[dataIndex].dataReference);
				printf("  Data index in dataset:%d\n", controlBlockDataList.datasetDatas[dataIndex].dataIndexInDataset);
				printf("  Data type:%d\n", controlBlockDataList.datasetDatas[dataIndex].data.type);
				printf("  Data size:%d\n", controlBlockDataList.datasetDatas[dataIndex].data.bitLength);
			}
		}
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetControlBlockDataList(IEC61850 server, IEC61850_CBHandleInfo* cbHandleInfo, IEC61850_ControlBlockDataList* controlBlockDataList);

/*!	\brief	使用控制块句柄批量发送控制块数据, 例如报告和GOOSE
	\ingroup	ControlBlock

	\param[in]	server			IEC61850 对象。<br>对象角色必须是服务端 `IEC61850_SERVER`
	\param[in]	cbHandleInfo	控制块句柄
	\param[in]	dataList		控制块关联数据集的基本类型数据列表

	\return	错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_ErrorCode result = S_OK;
	S32 Magi1 = 1;
	S32 Magi2 = 2;
	S32 Magi3 = 3;
	IEC61850_QualityFlag Quality1 = IEC61850_QUALITY_OVERFLOW;
	IEC61850_QualityFlag Quality2 = IEC61850_QUALITY_OUTOFRANGE;
	IEC61850_QualityFlag Quality3 = IEC61850_QUALITY_GOOD;
	IEC61850_TimeStamp Time1 = { 0 };
	IEC61850_TimeStamp Time2 = { 0 };
	IEC61850_TimeStamp Time3 = { 0 };

	IEC61850 iec61850 = GetMyServerClient();
	IEC61850_ControlBlockDataList controlBlockDataList = { 0 };
	IEC61850_CBHandleInfo cbHandleInfo = { 0 };
	char* cbReference = "ServerIEDExample/MMXU0.Measurement";

	cbHandleInfo.controlBlockType = CONTROLBLOCK_REPORT;
	cbHandleInfo.index = 1;
	result = IEC61850_GetControlBlockHandle(iec61850, cbReference, &cbHandleInfo);
	if (result == S_OK) {
	result = IEC61850_GetControlBlockDataList(iec61850, &cbHandleInfo, &controlBlockDataList);
	}
	controlBlockDataList.datasetDatas[0].data.pvData = &Magi1;
	controlBlockDataList.datasetDatas[1].data.pvData = &Quality1;
	controlBlockDataList.datasetDatas[2].data.pvData = &Time1;
	controlBlockDataList.datasetDatas[3].data.pvData = &Magi2;
	controlBlockDataList.datasetDatas[4].data.pvData = &Quality2;
	controlBlockDataList.datasetDatas[5].data.pvData = &Time2;
	controlBlockDataList.datasetDatas[6].data.pvData = &Magi3;
	controlBlockDataList.datasetDatas[7].data.pvData = &Quality3;
	controlBlockDataList.datasetDatas[8].data.pvData = &Time3;

	result = IEC61850_BatchUpdateControlBlockDatas(iec61850, &cbHandleInfo, &controlBlockDataList);
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_BatchUpdateControlBlockDatas(IEC61850 server, IEC61850_CBHandleInfo* cbHandleInfo, IEC61850_ControlBlockDataList* dataList);

/*!	\brief	本地选择激活定值组。
	\details
	该接口为服务端使用的接口，客户端禁止调用。

	\ingroup 	SGCB

	\param[in]	server			IEC61850 对象。对象角色必须是服务端
	\param[in]	sgcbReference	定值组控制块的引用
	\param[in]	sgNum			选择激活组的编号

	\return	成功返回 0，失败返回 #eServiceError 对应的代码

	<b>示例</b>
	\code
	eServiceError serviceErr = S_OK;
	IEC61850 iec61850 = GetMyServerClient();
	char* sgcbRef = "ServerIEDExample/LLN0.SGCB";
	U8 sgNum = 2;
	serviceErr = IEC61850_LocalSelectActiveSG(iec61850, sgcbRef, sgNum);
	\endcode
*/
PIS10_API eServiceError IEC61850_LocalSelectActiveSG(IEC61850 server, char* sgcbReference, U8 sgNum);

/*!	\brief	该接口用于使能或取消使能报告控制块实例。
	\details
	该接口为客户端使用的接口，服务端禁止调用。<br>
	调用该接口时，需要已知 `rcbInstRef` 参数指定的报告控制块实例是缓存的（BRCB）还是非缓存的（URCB），并根据其类型指定 `bufferFlag` 参数值。

	\ingroup	Report

	\param[in]	client			IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]	serverIndex		服务端的索引号
	\param[in]	rcbInstRef		要使能或取消使能的报告控制块实例的引用。<br>例如：`LDName/LNName.RCBName01`
	\param[in]	buffered		`rcbInstRef` 对应的报告控制块的缓存类型标记。<br>
								若为缓存报告控制块（BRCB），则该参数必须指定为 TRUE；<br>
								若为非缓存报告控制块（URCB），则该参数必须指定为 FALSE。
	\param[in]	enable			要设置的使能状态。<br>TRUE：使能；<br>FALSE：取消使能

	\return		错误码。<br>成功则返回  #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_ErrorCode error = IEC61850_ERROR_NONE;
	IEC61850 myClient = GetMyServerClient();
	unsigned int serverIndex = 0;

	char* rcbInstRef = "ServerIEDExample/MMXU0.ExampleRCB01";
	Boolean buffered = FALSE;
	Boolean rptEna = TRUE;

	error = IEC61850_ReportEnable(myClient, serverIndex, rcbInstRef, buffered, rptEna);
	if (error != IEC61850_ERROR_NONE) {
		printf("failed. error=[%d]\n", error);
	} else {
		printf("success.\n");
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_ReportEnable(IEC61850 client, unsigned int serverIndex, char* rcbInstRef, Boolean buffered, Boolean enable);

/*!	\brief	该接口用于对报告控制块实例请求总召唤（GI，general-interrogation）。
	\details
	该接口为客户端使用的接口，服务端禁止调用。<br>
	调用该接口时，需要已知 `rcbInstRef` 参数指定的报告控制块实例是缓存的（BRCB）还是非缓存的（URCB），并根据其类型指定 `bufferFlag` 参数值。

	\ingroup	Report

	\param[in]	client			IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]	serverIndex		服务端的索引号
	\param[in]	rcbInstRef		要请求总召唤的报告控制块实例的引用。<br>例如：`LDName/LNName.RCBName01`
	\param[in]	buffered		`rcbInstRef` 对应的报告控制块的缓存类型标记。<br>
								若为缓存报告控制块（BRCB），则该参数必须指定为 TRUE；<br>
								若为非缓存报告控制块（URCB），则该参数必须指定为 FALSE。

	\return		响应的 ServiceError。<br>肯定响应时，值为 #SERVICE_ERROR_NO_ERROR (0) ；<br>否定响应时，值为其他非 0 值的 #eServiceError 枚举值。

	\remark
	仅在报告控制块实例已经使能的情况下，才可以对其请求总召唤。<br>
	报告控制块实例未被使能时，调用该接口无法触发其上送总召唤报告；<br>
	报告控制块实例未启用总召唤的触发条件时，调用该接口也无法触发其上送总召唤报告。<br>
	该接口不具备使能报告控制块实例的功能。

	<b>示例</b>
	\code
	eServiceError error = SERVICE_ERROR_NO_ERROR;
	IEC61850 myClient = GetMyServerClient();
	unsigned int serverIndex = 0;

	char* rcbInstRef = "ServerIEDExample/MMXU0.ExampleRCB01";
	Boolean buffered = FALSE;

	error = IEC61850_ReportGI(myClient, serverIndex, rcbInstRef, buffered);
	if (error != SERVICE_ERROR_NO_ERROR) {
		printf("failed. error=[%d]\n", error);
	} else {
		printf("success.\n");
	}
	\endcode
*/
PIS10_API eServiceError IEC61850_ReportGI(IEC61850 client, unsigned int serverIndex, char* rcbInstRef, Boolean buffered);

/*!	\brief	本地选择编辑定值组。
	\details
	该接口为服务端使用的接口，客户端禁止调用。

	\ingroup	SGCB

	\param[in]	server			IEC61850 对象。对象角色必须是服务端
	\param[in]	sgcbReference	定值组控制块的引用
	\param[in]	sgNum			选择编辑组的编号

	\return		成功返回 0，失败返回 #eServiceError 对应的代码

	<b>示例</b>
	\code
	eServiceError serviceErr = S_OK;
	IEC61850 iec61850 = GetMyServerClient();
	char* sgcbRef = "ServerIEDExample/LLN0.SGCB";
	U8 sgNum = 2;

	serviceErr = IEC61850_LocalSelectEditSG(iec61850, sgcbRef, sgNum);
	\endcode
*/
PIS10_API eServiceError IEC61850_LocalSelectEditSG(IEC61850 server, char* sgcbReference, U8 sgNum);

/*!	\brief	本地设置定值组值。
	\details
	该接口为服务端使用的接口，客户端禁止调用。

	\ingroup	SGCB

	\param[in]	server			IEC61850 对象。对象角色必须是服务端
	\param[in]	dataRef			定值组数据的引用，必须引用到最基本类型，数组必须携带下标
	\param[in]	dataAttribute	设置的数据

	\return		成功返回 0，失败返回 #eServiceError 对应的代码

	<b>示例</b>
	\code
	eServiceError serviceErr = S_OK;
	IEC61850 iec61850 = GetMyServerClient();
	char* dataRef = "ServerIEDExample/IARC0.MemFull.setVal";
	IEC61850_DataAttributeData daData = { 0 };
	S32 newVal = 123;

	daData.bitLength = sizeof(S32) * 8;	// set the size of the data in bits
	daData.type = IEC61850_DATATYPE_INT32;	  //set the type of the data
	daData.pvData = &newVal;			 	// set a pointer to the data
	serviceErr = IEC61850_LocalSetEditSGValue(iec61850, dataRef, &daData);
	\endcode
*/
PIS10_API eServiceError IEC61850_LocalSetEditSGValue(IEC61850 server, char* dataRef, IEC61850_DataAttributeData* dataAttribute);

/*!	\brief	本地确认编辑定值组。
	\details
	该接口为服务端使用的接口，客户端禁止调用。

	\ingroup	SGCB

	\param[in]	server			IEC61850 对象。对象角色必须是服务端
	\param[in]	sgcbReference	定值组控制块的引用

	\return		成功返回 0，失败返回 #eServiceError 对应的代码

	<b>示例</b>
	\code
	eServiceError serviceErr = S_OK;
	IEC61850 iec61850 = GetMyServerClient();
	char* sgcbRef = "ServerIEDExample/LLN0.SGCB";
	serviceErr = IEC61850_LocalConfirmEditSGValues(iec61850, sgcbRef);
	\endcode
*/
PIS10_API eServiceError IEC61850_LocalConfirmEditSGValues(IEC61850 server, char* sgcbReference);

/*!	\brief	获取IED名称列表。
	\ingroup	Support

	\param[in]		iec61850	IEC61850 对象	
	\param[in,out]	outValue	IED名称。应使用一个长度不少于 65 的字符串数组(例如 `char iedName[65]`)来接收数据。
	\param[in]		length		outValue内存长度。该参数现状未使用，且需要指定为大于 0 的值，未来将会删除该参数。

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	char iedName[OBJECT_NAME_STRING_LEN+1] = { 0 };
	if (IEC61850_GetIEDName(GetMyServerClient(), iedName, OBJECT_NAME_STRING_LEN) == S_OK) {
		printf("IED name:%s", iedName);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetIEDName(IEC61850 iec61850, char* outValue, int length);

/*!	\brief	基于引用获取数据属性值。
	\details
	该接口为服务端使用的接口。

	\ingroup	DataAttributeAccess

	\param[in]		server		IEC61850 对象。对象角色必须是服务端
	\param[in]		ref			引用字符串
	\param[in,out]	outValue	数据属性返回值

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = {0};
	if (IEC61850_GetDataAttributeDataByReference(GetMyServerClient(), "ServerIEDExample/MMXU0.A.phsA.cVal.mag.i", &data) == S_OK) {
		printf("type=%d, bitLength=%d, arrayIndex=%d\n", (int)data.type, data.bitLength, data.arrayIndex);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDataAttributeDataByReference(IEC61850 server, const char* ref, IEC61850_DataAttributeData* outValue);

/*!	\brief	基于数据属性的ID(DAID)，获取数据属性的引用。
	\details
	该接口为服务端使用的接口。

	\ingroup	Support

	\param[in]		server		IEC61850 对象。对象角色必须是服务端
	\param[in]		daid		数据属性的ID
	\param[in,out]	outRef		短地址对应的数据属性的引用。应使用一个长度不少于 130 的字符串数组(例如 `char ref[130]`)来接收数据。
	\param[in]		length		outRef内存长度

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_DataAttributeID daid = { 1, 2, 3, 4, 5 };
	char ref[OBJECT_REFERENCE_STRING_LEN + 1] = { 0 };
	if (IEC61850_GetReferenceByDAID(server, &daid, ref, OBJECT_REFERENCE_STRING_LEN) == S_OK) {
		printf("ref = %s\n", ref);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetReferenceByDAID(IEC61850 server, IEC61850_DataAttributeID* daid, char* outRef, int length);

/*!	\brief	基于数据属性的ID，获取数据属性的短地址。
	\details
	该接口为服务端使用的接口。

	\ingroup	Support

	\param[in]		server		IEC61850 对象。对象角色必须是服务端
	\param[in]		ref			数据属性的引用
	\param[out]		daid		引用对应的数据属性的ID（DAID）

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_DataAttributeID daid = { 0 };
	if (IEC61850_GetShortAddrByReference(GetMyServerClient(), "ServerIEDExample/MMXU0.A.phsA.cVal.mag.i", &daid) == S_OK) {
		printf("ref = %s\n", sAddr);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetDAIDByReference(IEC61850 server, char* ref, IEC61850_DataAttributeID* daid);

/*!	\brief	基于数据属性的短地址，获取数据属性的引用。
	\details
	该接口为服务端使用的接口。

	\ingroup	Support

	\param[in]		server		IEC61850 对象。对象角色必须是服务端
	\param[in]		sAddr		数据属性的短地址（sAddr）
	\param[in,out]	outValue	短地址对应的数据属性的引用。应使用一个长度不少于 130 的字符串数组(例如 `char ref[130]`)来接收数据。
	\param[in]		length		outValue内存长度

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	char ref[130] = {0};
	if (IEC61850_GetReferenceByShortAddr(GetMyServerClient(), "sAddrExample", ref, 129) == S_OK) {
		printf("ref = %s\n", ref);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetReferenceByShortAddr(IEC61850 server, char* sAddr, char* outValue, int length);

/*!	\brief	基于数据属性的引用，获取数据属性的短地址。
	\details
	该接口为服务端使用的接口。

	\ingroup	Support

	\param[in]		server		IEC61850 对象。对象角色必须是服务端
	\param[in]		ref			数据属性的引用
	\param[in,out]	outValue	引用对应的数据属性的短地址（sAddr）<br>
								由于短地址的长度任意，因此，请依据实际情况，使用一个足够长度的字符串数组来接收输出的短地址。
	\param[in]		length		outValue内存长度

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	char sAddr[100] = {0};
	if (IEC61850_GetShortAddrByReference(GetMyServerClient(), "ServerIEDExample/MMXU0.A.phsA.cVal.mag.i", sAddr, 129) == S_OK) {
		printf("sAddr = %s\n", sAddr);
	}
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_GetShortAddrByReference(IEC61850 server, char* ref, char* outValue, int length);

/*!	\brief	获取 IEC61850 对象对应的数据映射模式。
	\ingroup	Support

	\param[in]	iec61850	IEC61850 对象

	\return		返回 IEC61850 对象对应的数据映射模式，对应 #IEC61850_DataMapMode 的枚举值。
*/
PIS10_API IEC61850_DataMapMode IEC61850_GetDataMapMode(IEC61850 iec61850);
	
/*!	\brief	该接口用于快速构建对应数据类型的 IEC61850_DataAttributeData 数据。
	\details
	本接口目的在于规避用户构建 IEC61850_DataAttributeData 数据时，需要依据不同数据类型来手动指定响应的数据长度的麻烦。

	\ingroup	Support

	\param[in]	daData	数据属性对象要赋值的 IEC61850_DataAttributeData
	\param[in]	type	数据类型。指定为 #IEC61850_DataType 的枚举值。
	\param[in]	data	要赋值赋值给 daData 的数据的地址。

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。

	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = {0};
	S32 val = 0;
	IEC61850_DataType type = IEC61850_DATATYPE_INT32;
	IEC61850_ErrorCode err = IEC61850_SetDataAttributeData(&data, type, &val);
	\endcode
*/
PIS10_API IEC61850_ErrorCode IEC61850_SetDataAttributeData(IEC61850_DataAttributeData* daData, IEC61850_DataType type, void* data);

/*!	\brief	设置布尔类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData

	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	Boolean val = TRUE;
	IEC61850_SetDataBoolean(&data, &val);
	\endcode
*/
#define IEC61850_SetDataBoolean(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_BOOLEAN, (p))

/*!	\brief	设置INT8类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
		
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	S8 val = 1;
	IEC61850_SetDataInt8(&data, &val);
	\endcode
*/
#define IEC61850_SetDataInt8(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_INT8, (p))

/*!	\brief	设置有无符号INT8U类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	U8 val = 1;
	IEC61850_SetDataInt8U(&data, &val);
	\endcode
*/
#define IEC61850_SetDataInt8U(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_INT8U, (p))

/*!	\brief	设置INT16类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	S16 val = 1;
	IEC61850_SetDataInt16(&data, &val);
	\endcode
*/
#define IEC61850_SetDataInt16(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_INT16, (p))

/*!	\brief	设置INT32类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	S32 val = 1;
	IEC61850_SetDataInt32(&data, &val);
	\endcode
*/
#define IEC61850_SetDataInt32(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_INT32, (p))

/*!	\brief	设置INT64类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	S64 val = 1;
	IEC61850_SetDataInt64(&data, &val);
	\endcode
*/
#define IEC61850_SetDataInt64(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_INT64, (p))

/*!	\brief	设置无符号INT16U类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	U16 val = 1;
	IEC61850_SetDataInt16U(&data, &val);
	\endcode
*/
#define IEC61850_SetDataInt16U(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_INT16U, (p))

/*!	\brief	设置无符号INT32U类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	U32 val = 1;
	IEC61850_SetDataInt32U(&data, &val);
	\endcode
*/
#define IEC61850_SetDataInt32U(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_INT32U, (p))

/*!	\brief	设置浮点Float32类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	Float32 val = 1;
	IEC61850_SetDataFloat32(&data, &val);
	\endcode
*/
#define IEC61850_SetDataFloat32(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_FLOAT32, (p))

/*!	\brief	设置浮点Float64类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	Float64 val = 1;
	IEC61850_SetDataFloat64(&data, &val);
	\endcode
*/
#define IEC61850_SetDataFloat64(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_FLOAT64, (p))

/*!	\brief	设置枚举类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	IEC61850_ModeAndBehaviourState val = 1;
	// U8 val = 1;
	IEC61850_SetDataEnum(&data, &val);
	\endcode
*/
#define IEC61850_SetDataEnum(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_ENUMERATED, (p))

/*!	\brief	设置字符串类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	char val[200] = "test";
	IEC61850_SetDataVisibleString(&data, &val);
	\endcode
*/
#define IEC61850_SetDataVisibleString(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_VISIBLE_STRING, (p))

/*!	\brief	设置Unicode字符串类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	char val[200] = "test中文";
	IEC61850_SetDataUnicodeString(&data, &val);
	\endcode
*/
#define IEC61850_SetDataUnicodeString(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_UNICODE_STRING, (p))

/*!	\brief	设置时间戳类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	IEC61850_TimeStamp t = { 0 };
	IEC61850_GetTime(NULL, &t);
	IEC61850_SetDataTimestamp(&data, &val);
	\endcode
*/
#define IEC61850_SetDataTimestamp(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_TIMESTAMP, (p))
	
/*!	\brief	设置质量类型数据(宏定义)
	\see	IEC61850_SetDataAttributeData(), IEC61850_DataAttributeData
	  
	<b>示例</b>
	\code
	IEC61850_DataAttributeData data = { 0 };
	tIEC61850Quality val = IEC61850_QUALITY_GOOD;
	IEC61850_SetDataQuality(&data, &val);
	\endcode
*/
#define IEC61850_SetDataQuality(data, p) IEC61850_SetDataAttributeData((data), IEC61850_DATATYPE_QUALITY, (p))

/*!	\brief	操作前选择。（基于引用）
	\details
	控制服务接口。用于对指定 DAID 的控制对象执行操作前选择命令。<br>
	对应的 ACSI 服务接口为：\"Select\" / \"SelectWithValue\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。<br>
	该接口仅应用于 操作前选择（SBOns / SBOes）的控制对象，不能用于 直接控制（DOns / DOes）的控制对象。<br>
	<br>
	若控制值参数 `ptSelectValue` 为 NULL，则执行适用于 SBOns 控制对象的 选择（Select）命令；<br>
	若控制值参数 `ptSelectValue` 有被设置，则执行适用于 SBOes 控制对象的 带值选择（SelectWithValue）命令。<br>
	<br>
	控制对象被选择成功后，将由未选择（Unselected）状态变为准备就绪（Ready）状态，同时，选择超时计时器将开始计时，<br>
	若超时之前没有对其执行后续的操作命令，其选择状态会因选择超时而被取消，控制对象会复归为未选择（Unselected）状态，再次控制需要重新对其执行操作前选择。<br>
	选择超时的时限，由控制对象的 sboTimeout 数据属性指定。若未明确指定 sboTimeout 时间，则默认为 30 秒。<br>
	<br>
	带有 Oper.operTm 数据属性的控制对象，将被视为时间激活的控制对象。<br>
	若时间激活的控制对象是 SBOes 的，则还需要带有 SBOw.operTm 数据属性。（SBOns 的控制对象仅需要 SBO 数据属性，不需要SBOw.operTm 数据属性）<br>
	带值选择（SelectWithValue）SBOes 的时间激活的控制对象时，需要在 `param` 参数中指定激活控制的操作时间。

	\ingroup 	Control

	\param[in]	client		IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]	aaIndex 		连接服务端的连接序号
	\param[in]	ctlRef		控制对象的引用。应指定到控制对象的 DO 层级。例如 `LDName/CSWI0.Pos`
	\param[in]	selectValue	控制值。<br>
							即，带值选择（SelectWithValue）SBOes 控制对象的控制值（ctlVal）；<br>
							对于选择（Select）SBOns 控制对象的场合，应指定为 NULL。
	\param[in]	param		控制参数。<br>
							用于指定控制请求的 同期检查（SynchroCheck）、互锁检查（Interlock\-Check）、测试（Test）属性，以及时间激活控制的操作时间（operTm）。<br>
							操作 SBOns / SBOes 控制对象时，需要与操作前选择（Select / SelectWithVal）命令的控制参数一致。

	\return		错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_ControlSelectWithRef(IEC61850 client, int aaIndex, char* ctlRef, IEC61850_DataAttributeData* selectValue, IEC61850_ControlParameters* param);

/*!	\brief	操作。（基于引用）
	\details
	控制服务接口。用于对指定 DAID 的控制对象执行操作命令。<br>
	对应的 ACSI 服务接口为：\"Operate\" / \"TimeActivatedOperate\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。<br>
	<br>
	对于 SBOns / SBOes 的控制对象，应该在调用本接口之前，先调用 `IEC61850_ControlSelect()` 接口对其执行操作前选择。<br>
	选择成功后才可以对其执行操作命令，操作命令需要在选择超时之前执行。<br>
	同时，操作命令附带的控制值和控制参数，也需要与操作前选择命令（Select / SelectWithValue）中的一致。<br>
	<br>
	带有 Oper.operTm 数据属性的控制对象，将被视为时间激活的控制对象，对其执行的操作命令将按照 时间激活的操作（TimeActivatedOperate）来处理，<br>
	需要在 `param` 参数中指定激活控制的操作时间。若时间激活的控制对象是 SBOes 的，则指定的操作时间也需要与带值选择（SelectWithValue）命令中的一致。

	\ingroup	Control

	\param[in]	client 			IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]	aaIndex 		连接服务端的连接序号
	\param[in]	ctlRef 			控制对象的引用。应指定到控制对象的 DO 层级。例如 `LDName/CSWI0.Pos`
	\param[in]	operateValue 	操作命令的控制值<br>
								操作 SBOes 控制对象时，需要与带值选择（SelectWithVal）命令的控制值一致。
	\param[in]	param			控制参数。<br>
								用于指定控制请求的 同期检查（SynchroCheck）、互锁检查（Interlock\-Check）、测试（Test）属性，以及时间激活控制的操作时间（operTm）。<br>
								操作 SBOns / SBOes 控制对象时，需要与操作前选择（Select / SelectWithVal）命令的控制参数一致。

	\return	错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_ControlOperateWithRef(IEC61850 client, int aaIndex, char* ctlRef, IEC61850_DataAttributeData* operateValue, IEC61850_ControlParameters* param);

/*!	\brief	控制取消。（基于引用）
	\details
	控制服务接口。用于对指定 ref 的控制对象执行取消命令。<br>
	对应的 ACSI 服务接口为：\"Cancel\"。<br>
	该接口为客户端使用的接口，服务端禁止调用。<br>
	<br>
	该接口可用于取消对控制对象的操作前选择（Select / SelectWithValue），以及用于取消尚未到达激活操作时间的时间激活操作（TimeActivatedOperate）。<br>
	取消命令附带的控制值和控制参数，需要与要被取消的控制命令（Select / SelectWithValue / TimeActivatedOperate）的控制值和控制参数一致。

	\ingroup	Control

	\param[in]	client			IEC61850 对象。<br>对象角色必须是客户端 `IEC61850_CLIENT`
	\param[in]	aaIndex 		连接服务端的连接序号
	\param[in]	ctlRef			控制对象的引用。应指定到控制对象的 DO 层级。例如 `LDName/CSWI0.Pos`
	\param[in]	operateValue	取消命令的控制值。<br>
								需要与要被取消的控制命令（SelectWithVal / TimeActivatedOperate）的控制值一致。<br>
								取消对 SBOns 控制对象的操作前选择（Select）时，应指定为 NULL。
	\param[in]	param			控制参数。

	\return	错误码。<br>成功则返回 #IEC61850_ERROR_NONE (0)；<br>失败则返回其他非 0 值的 #IEC61850_ErrorCode 错误码。
*/
PIS10_API IEC61850_ErrorCode IEC61850_ControlCancelWithRef(IEC61850 client, int aaIndex, char* ctlRef, IEC61850_DataAttributeData* operateValue, IEC61850_ControlParameters* param);

#ifdef __cplusplus
}
#endif

#endif
